内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Spring Security

2018-06-08 16:18 出处:清屏网 人气: 评论(0

对当前项目中使用到的Spring Security做一个简单的理解总结,方便以后查阅。 文章有疏漏之处,欢迎指正。

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访 问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了Spring IOC和AOP功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。应用程序层面的安全大概可以归为两类:身份认证和授权,Spring Security 在架构设计上就将两者分开了,在每个架构上都留有扩展点。

1 身份认证架构

1.1 AuthenticationManager

身份认证的核心接口,只包含一个方法:
public interface AuthenticationManager {
    Authentication authenticate(Authentication authentication)
            throws AuthenticationException;
}

authenticate 方法可能产生三种结果:

a) 如果身份认证成功,返回完备的 Authentication 对象(一般来说, authenticated=true)

b) 如果身份认证失败,抛出 AuthenticationException

c) 如果无法认证,则返回 null

1.2 ProviderManager

是最常用的 AuthenticationManager 接口的实现类,它将工作委托给 AuthenticationProvider 链。AuthenticationProvider 的接口定义类似于 AuthenticationManager,只不过多了个方法让调用者判断其是否支持传入的 Authentication 类型。

ProviderManager 会遍历 AuthenticationProvider 链,先判 断其是否支持传入的 Authentication 类型,如果支持,则调用 authenticate 方法, 如返回不为 null 的 Authentication,则身份认证成功。


for (AuthenticationProvider provider : getProviders()) {
            if (!provider.supports(toTest)) {
                continue;
            }

            if (debug) {
                logger.debug("Authentication attempt using "
                        + provider.getClass().getName());
            }

            try {
                result = provider.authenticate(authentication);

                if (result != null) {
                    copyDetails(authentication, result);
                    break;
                }
            }
            catch (AccountStatusException e) {
                prepareException(e, authentication);
                // SEC-546: Avoid polling additional providers if auth failure is due to
                // invalid account status
                throw e;
            }
            catch (InternalAuthenticationServiceException e) {
                prepareException(e, authentication);
                throw e;
            }
            catch (AuthenticationException e) {
                lastException = e;
            }
        }

View Code

2 授权架构

2.1 AccessDecisionManager

decide 方法决定是否允许访问被保护的对象,传入的参数中,authentication 是被身份认证通过后的完备对象,object是被保护的对象, configAttributes是被保护对象的属性信息。

2.2 AbstractAccessDecisionManager

在这两个方法中,logout 和 onLogoutSuccess 除了执行Spring Security自己的一些内部方法,比如 SecurityContextLogoutHandler 的 logout,我们也可以自己定义自己的方法,退出登录需要删除自定义的cookie等。

3.1.3 UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter

先看看 AbstractAuthenticationProcessingFilter 的 doFilter 方法

20行的 attemptAuthentication(request, response) 就是 UsernamePasswordAuthenticationFilter 是尝试认证过程。

--------------------------------------UsernamePasswordAuthenticationFilter 分析开始---------------------------------------------------------------

身份认证过程:根据 form 表单中的用户名获取用户信息(包含密码),将数 据库中的密码和 form 表单中的密码做比对,若匹配则身份认证成功,并调用 AuthenticationSuccessHandler. onAuthenticationSuccess()。

下图显示的是认证成 功的交互过程:

因为真实项目登录除了校验用户名和密码外,可能还有有些额外的校验,比如验证码之类的,所有我们会自定义一个类去继承 UsernamePasswordAuthenticationFilter,然后重写 attemptAuthentication() 方法。

类 UsernamePasswordAuthenticationFilter 的 attemptAuthentication(HttpServletRequest request, HttpServletResponse response)方法:

分享给小伙伴们:
本文标签: Spring

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号