spring security 自定义认证实现

开篇

 接上篇,spring security为我们实现了基于cas的认证,但是在实际项目中经常会遇到非cas的情况,这就需要我们基于spring security 实现自定义的认证,所谓自定义认证即可以自由扩展实现和第三方的SSO、SAM等无缝对接认证。

 本文的前提是你对 spring security有一定的理解,请参阅之前提到的 spring security理论,或者查阅官方文档,记得本系列是在2.0.8基础上 做说明。如果是3.x版本会有小的差异。

 第三方认证,其实就是提供一个认证提供者,拿到用户名、密码之后调用第三方验证是否合法用户。下来实际操作一番:

 首先,你需要实现 AuthenticationProvider接口,并实现 authenticate方法和 supports方法,完整代码如下:

public class LeoAuthenticationProvider implements AuthenticationProvider{

private UserDetailsService userDetailsService;

public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

@Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        //1、获取用户名、密码
        String username = authentication.getName();
        String password = authentication.getPrincipal().toString();

//2、调用第三方认证
        boolean isSuccess = thirdPartyAuthenticate(username, username);

//3、通过UserDetailsService构建UserDetails
        UserDetails userDtails = null;
        if(isSuccess) {
            userDtails = userDetailsService.loadUserByUsername(username);
            GrantedAuthorityImpl authority = new GrantedAuthorityImpl("ROLE_EVERYONE");
            userDtails.getAuthorities();
        }
        //4、返回令牌对象
        return new UsernamePasswordAuthenticationToken(username, username, userDtails.getAuthorities());
    }

@Override
    public boolean supports(Class authentication) {
        //判断authentication是不是一个合法的可支持的对象,一般为实现了Authentication接口的实现类,
        //spring security为我们提供了默认的实现类UsernamePasswordAuthenticationToken
        return true;
    }
    //第三方认证实现,这里判断用户名和密码相等就OK,实际根据三方提供的接口来实现,返回boolean值即可
    private boolean thirdPartyAuthenticate(String username, String password) {
        if(username.equals(password)) {
            return true;
        } else {
            return false;
        }
    }
}

 代码很简单,有注释,应该不难理解。下来看看如何配置:

//认证管理
<security:authentication-manager alias="authenticationManager" />

//认证提供者`<bean id="leoAuthenticationProvider" class="org.leo.security.LeoAuthenticationProvider">`
    `<property name="userDetailsService" ref="userDetailsService"/>`
    <security:custom-authentication-provider />
`</bean>`

 OK,至此,一个完整的三方SSO集成已经实现,有兴趣可以自己动手尝试一下。