在#request.userPrincipal.name

时间:2019-01-06 13:57:45

标签: java spring spring-security oauth-2.0

我遇到问题,找不到合适的解决方案。我想在登录后显示用户名。有两种授权方式-通过登录和通过google帐户,这两种方法都重定向到同一页面,即indexLog.html。当我使用用户名/密码登录时,我正在获取用户名,但是当我使用Google而不是名称时,例如“ John Snow”,我正在获取ID(例如123902940049029)。

LoginController:

@Controller
public class LoginController {

@Autowired
private OAuth2AuthorizedClientService authorizedClientService;

private static String authorizationRequestBaseUri
        = "oauth2/authorization";
Map<String, String> oauth2AuthenticationUrls
        = new HashMap<>();

@Autowired
private ClientRegistrationRepository clientRegistrationRepository;

@GetMapping("/oauth_login")
    public String getLoginPage(Model model) {
        Iterable<ClientRegistration> clientRegistrations = null;
        ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository)
                .as(Iterable.class);
        if (type != ResolvableType.NONE &&
                ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) {
            clientRegistrations = (Iterable<ClientRegistration>) clientRegistrationRepository;
        }

        clientRegistrations.forEach(registration ->
                oauth2AuthenticationUrls.put(registration.getClientName(),
                        authorizationRequestBaseUri + "/" + registration.getRegistrationId()));
        model.addAttribute("urls", oauth2AuthenticationUrls);

        return "oauth_login";
    }

@GetMapping("/loginSuccess")
public String getLoginInfo(Model model, OAuth2AuthenticationToken authentication) {

    OAuth2AuthorizedClient client = authorizedClientService.loadAuthorizedClient(authentication.getAuthorizedClientRegistrationId(), authentication.getName());

    String userInfoEndpointUri = client.getClientRegistration()
            .getProviderDetails()
            .getUserInfoEndpoint()
            .getUri();

    if (!StringUtils.isEmpty(userInfoEndpointUri)) {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + client.getAccessToken()
                .getTokenValue());

        HttpEntity<String> entity = new HttpEntity<String>("", headers);

        ResponseEntity<Map> response = restTemplate.exchange(userInfoEndpointUri, HttpMethod.GET, entity, Map.class);
        Map userAttributes = response.getBody();
        model.addAttribute("username", userAttributes.get("name"));

    }
    return "loginSuccess";
}

WebSecurityConfig:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/images/**", "/", "/index", "/oauth_login").permitAll()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin()
                    .loginPage("/login")
                    .defaultSuccessUrl("/indexLog", true)
                    .permitAll()
                    .and()
                    .oauth2Login()
                    .loginPage("/oauth_login")
                    .authorizationEndpoint()
                    .baseUri("/oauth2/authorization")
                    .authorizationRequestRepository(authorizationRequestRepository())
                    .and()
                    .tokenEndpoint()
                    .accessTokenResponseClient(accessTokenResponseClient())
                    .and()
                    .failureUrl("/loginFailure")
                    .defaultSuccessUrl("/indexLog", true);
        }

  @Bean
    public AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository() {
        return new HttpSessionOAuth2AuthorizationRequestRepository();
    }

    @Bean
    public OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest>
    accessTokenResponseClient() {

        return new NimbusAuthorizationCodeTokenResponseClient();
    }


    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("john")
                .password(passwordEncoder().encode("123"))
                .roles("USER");
    }

}

indexLog.html:

<h3>
    <div class="label label-info">
        <h1>Hello <span th:text="${#request.userPrincipal.name}"></span></h1>
    </div>
</h3>

是否有解决此问题的简单方法,还是应该通过添加用户模型和UserPrincipal模型来定义已认证用户的详细信息来扩展安全逻辑?

0 个答案:

没有答案