7.2 SpringSecurity源码解析
SpringSecurity基本原理简介
绿色部分:负责身份认证的过滤器;
AnnoymousAuthenticationFilter:负责最后的认证过滤;
FilterSecurityInterceptor:决定了最终是否可以访问后面的Rest API;
ExceptionTranslationFilter:则会处理FilterSecurityInterceptor类中抛出的异常;
7.2.1、AnnoymousAuthenticationFilter类处理逻辑简介
途中的principal中的值如果是认证通过的情况下放的是userDetails接口中的值,如果没有认证成功,则放的是字符串anonymousUser,用户的角色为ROLE_ANONYMOUS;
7.2.2、认证逻辑简介
授权流程描述:左侧的部分系统会去拿到一份,在SecurityConfig中配置的url权限信息,右侧部分会拿到当前访问的authentication所拥有的访问权限信息,再将当前的请求信息一起携带上后,交给访问决策管理者(AccessDecisionManager);管理者将这些信息交给一个投票者(AccessDecisionVoter)来根据给出的信息进行是否可以访问的投票,然后将投票信息交给AbstractAccessDecisionManager,这是一个接口,分别由三个实现类来根据选择的决策方法来决定是否可以访问。
决策器 | 描述 |
---|---|
AffirmativeBased | 有一个投过就过 |
ConsensusBased | 根据投过的和投不过的比较决定 |
UnanimousBased | 只要有一个投不过就不过 |
特别说明:WebExpressionVoter是在Spring3+之后由于Spring支持表达式之后引入的;SpringSecurity3+之后,这个投票器包办了以前所有的投票器的功能。
7.2.3、认证逻辑源码跟踪
我们将断点打在下图中的位置,从fi对象中我们可以看到整个过滤器链中依次的过滤器,包括几个,在之前的章节中我们自己手动添加的过滤器。
进入到该方法中,我们可以看到
回到之前的这个类中,在进行了attribute是否为空的校验后,在非空的情况下,系统将,authenticated(登录用户对象),object(请求信息),attributes(配置中对于当前请求的权限信息)传给了访问决策管理者去进行决策;
调用具体的三种实现来投票,Spring默认的是第一个实现;
这里在逻辑分析的时候说到,在Spring3+之后,都由这个vote来实现投票
在这里抛出异常后,将会由AbstractSecurityInterceptor继续抛出异常,然后由ExceptionTranslationFilter接到这个异常
断点处的后一行代码中在校验当前抛出的Exception是否是AuthenticationException,显然这里上面抛出的应该是一个AccessDeniedException,在下面代码中ase会被下面的方法赋值,然后调用处理方法处理这里的Exception。
这里给到的这个loginFormUrl是我们之前在下图中配置的登录界面的url