Как узнать, кто пытается войти, используя OAuth-метод «authorize»? - PullRequest
0 голосов
/ 03 июня 2018

Уже решено это .Теперь, после создания пользовательской страницы входа в систему с использованием JSP, я пытаюсь показать пользователю, какое приложение пытается получить учетные данные.

В моем веб-приложении (клиенте) я поместил эту конфигурацию в application.yml:

server:
    port: 8083
    context-path: /
    session:
      cookie:
        name: UI2SESSION
security:
  basic:
    enabled: false
  oauth2:
    client:
      clientId: cerberus
      clientSecret: cerberus
      accessTokenUri: http://localhost:8180/guardiao/oauth/token
      userAuthorizationUri: http://localhost:8180/guardiao/oauth/authorize
    resource:
      userInfoUri: http://localhost:8180/guardiao/user/me

Когда пользователь пытается перейти на любую страницу в этом приложении, он будет перенаправлен на страницу входа Guardiao (Guardian) (мой сервер OAuth2).

Метод, используемый клиентом для аутентификации пользователя на сервере OAuth: oauth/authorize

Все работает нормально, но было бы неплохо, если бы я мог получить некоторую информацию о клиенте для показа пользователюво время входа в систему на моей пользовательской странице, чтобы пользователь мог подтвердить приложение, которое он использует.

На стороне сервера OAuth (в Guardiao) у меня есть

@Configuration
@EnableWebSecurity
public class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter {

   // some blah blah blah

   @Override
   protected void configure(HttpSecurity http) throws Exception {

       http.csrf().disable()
           .requestMatchers()
           .antMatchers("/login", "/oauth/authorize")
       .and()
           .authorizeRequests()
           .anyRequest()
           .authenticated()
       .and()
        .formLogin()
            .loginPage("/loginPage")
            .loginProcessingUrl("/login")
            .failureUrl("/loginPage?error=true")
            .usernameParameter("username")
            .passwordParameter("password")
        .permitAll();
   }


}

, а loginPage.jsp -простая форма с полями имени пользователя и пароля для отправки на конечную точку /login как обычно.

Что мне нужно знать, так это: есть ли какие-нибудь JSTL-теги для получения того или иного клиента (приложение, которое пользователь пытается использовать изапрашивает логин в Guardiao), чтобы он отображался на моей странице входа в систему как Application XXXXXX is asking for your credentials?В этом случае приложение Cerberus.

Клиент выходит из базы данных (таблица oauth_client_details) и всего проекта, который вы можете найти здесь

1 Ответ

0 голосов
/ 04 июня 2018

После многих лет исследований и больших денег я нашел решение: просто перехватите контроллер loginForm и получите атрибут SavedRequest от Session.Вы можете получить атрибут client_id и прочитать его из базы данных или просто передать его через.

Вы также найдете client.getAdditionalInformation() очень полезным, если вы используете базу данных для хранения своих клиентов.

@Controller
public class LoginController {

    private ClientDetailsService clientDetailsService;

    @Autowired
    public void setClientDetailsService(ClientDetailsService clientDetailsService) {
        this.clientDetailsService = clientDetailsService;
    }


    @RequestMapping(value = "/loginPage", method = RequestMethod.GET)
    public String loginPage(Model model, HttpSession session, @RequestParam(value = "error", required = false) String error) {

        try {
            SavedRequest savedRequest = (SavedRequest)session.getAttribute("SPRING_SECURITY_SAVED_REQUEST");
            /*  Values are: client_id, redirect_uri, response_type and state  */
            String client_id = savedRequest.getParameterValues("client_id")[0]; 
            ClientDetails client = clientDetailsService.loadClientByClientId( client_id );
            model.addAttribute( "clientId", client.getClientId() );
        } catch ( Exception e ) {
            model.addAttribute( "directAccess", true ); // <<-- Tell the JSP page to hide the login form and warn the user to not access this page directly
        }

        return "loginPage";
    }   


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...