Spring引导基本身份验证和OAuth2在同一个项目中?

时间:2018-04-27 11:41:45

标签: java maven spring-boot intellij-idea spring-security

是否可以在我的其他应用程序中对某些端点使用OAuth2,并对其他某些端点使用基本身份验证。 它应该都适用于Spring安全性版本2.0.1.RELEASE。我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

是的,可以使用基本身份验证以及交织在一起的OAuth2身份验证,但我怀疑您是否能够像HttpSecurity authenticated()一样轻松设置它方法不允许您选择哪种身份验证方法(oauth2Login / formLogin)可以正常工作。

然而,有一种方法可以轻易绕过它:

您可以添加自定义权限,当用户使用基本身份验证进行连接时,我们可以将其称为ROLE_BASICAUTH,当用户使用OAuth2进行连接时,可以ROLE_OAUTH2。这样,你可以使用

.antMatchers("/endpoint-that-requires-basic-auth").hasRole("BASICAUTH")
.antMatchers("/endpoint-that-requires-oauth2").hasRole("OAUTH2")
    .anyRequest().authenticated()

当他们到达您希望进行基本身份验证(而非OAuth2)的端点时,您会检查他们当前的权限,如果它不是BASICAUTH,那么您使其会话无效,则会显示登录表单< em> without OAuth2 (强制他们使用基本身份验证)。

这样做的缺点是,您需要同时实施自定义UserDetailsService和自定义OAuth2UserService ......

但实际上并不那么难:

@Service
public class UserService extends DefaultOAuth2UserService implements UserDetailsService {

    // ...

    @Override
    public OAuth2User loadUser(OAuth2UserRequest oAuth2UserRequest) throws OAuth2AuthenticationException {
        OAuth2User user = super.loadUser(oAuth2UserRequest);

        Map<String, Object> attributes = user.getAttributes();
        Set<GrantedAuthority> authoritySet = new HashSet<>(user.getAuthorities());
        String userNameAttributeName = oAuth2UserRequest.getClientRegistration().getProviderDetails()
                .getUserInfoEndpoint().getUserNameAttributeName();

        authoritySet.add(new SimpleGrantedAuthority("ROLE_OAUTH2"));

        return new DefaultOAuth2User(authoritySet, attributes, userNameAttributeName);
    }


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDetails user = getUserFromDatabase(username); // you'll need to provide that method (where are the username/password stored?)
        if (user == null) { // UserDetailsService doesn't allow loadUserByUsername to return null, so throw exception
            throw new UsernameNotFoundException("Couldn't find user with username '"+username+"'");
        }
        // add ROLE_BASICAUTH (you might need a custom UserDetails implementation here, because by defaut, UserDetails.getAuthorities() is immutable (I think, I might be a liar)
        return user;
    }

}

请注意,这是一个粗略的实现,因此您也必须在您的最后解决这个问题。

您也可以使用此库https://github.com/TwinProduction/spring-security-oauth2-client-example/tree/master/custom-userservice-sample作为自定义OAuth2UserService的指南

祝你好运。