话说Spring Security权限管理(源码)

发布时间:2017-3-26 1:36:45 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"话说Spring Security权限管理(源码) ",主要涉及到话说Spring Security权限管理(源码) 方面的内容,对于话说Spring Security权限管理(源码) 感兴趣的同学可以参考一下。

最近项目需要用到Spring Security的权限控制,故花了点时间简单的去看了一下其权限控制相关的源码(版本为4.2)。

AccessDecisionManager

spring security是通过AccessDecisionManager进行授权管理的,先来张官方图镇楼。

权限

AccessDecisionManager

AccessDecisionManager 接口定义了如下方法:

//调用AccessDecisionVoter进行投票(关键方法)void decide(Authentication authentication, Object object,        Collection<ConfigAttribute> configAttributes) throws AccessDeniedException,        InsufficientAuthenticationException;boolean supports(ConfigAttribute attribute);boolean supports(Class clazz);

接下来看看它的实现类的具体实现:

AffirmativeBased

public void decide(Authentication authentication, Object object,        Collection<ConfigAttribute> configAttributes) throws AccessDeniedException {    int deny = 0;    for (AccessDecisionVoter voter : getDecisionVoters()) {        //调用AccessDecisionVoter进行vote(我们姑且称之为投票吧),后面再看vote的源码。        int result = voter.vote(authentication, object, configAttributes);        if (logger.isDebugEnabled()) {            logger.debug("Voter: " + voter + ", returned: " + result);        }                switch (result) {        case AccessDecisionVoter.ACCESS_GRANTED://值为1            //只要有voter投票为ACCESS_GRANTED,则通过            return;        case AccessDecisionVoter.ACCESS_DENIED://值为-1            deny++;            break;        default:            break;        }    }    if (deny > 0) {        //如果有两个及以上AccessDecisionVoter(姑且称之为投票者吧)都投ACCESS_DENIED,则直接就不通过了        throw new AccessDeniedException(messages.getMessage(                "AbstractAccessDecisionManager.accessDenied", "Access is denied"));    }    // To get this far, every AccessDecisionVoter abstained    checkAllowIfAllAbstainDecisions();}

源码中,有个Collection

通过以上代码可直接看到AffirmativeBased的策略:

  • 只要有投通过(ACCESS_GRANTED)票,则直接判为通过。
  • 如果没有投通过票且反对(ACCESS_DENIED)票在两个及其以上的,则直接判为不通过。

UnanimousBased

public void decide(Authentication authentication, Object object,        Collection<ConfigAttribute> attributes) throws AccessDeniedException {    int grant = 0;    int abstain = 0;    List<ConfigAttribute> singleAttributeList = new ArrayList<ConfigAttribute>(1);    singleAttributeList.add(null);    for (ConfigAttribute attribute : attributes) {        singleAttributeList.set(0, attribute);        for (AccessDecisionVoter voter : getDecisionVoters()) {            //配置的投票者进行投票            int result = voter.vote(authentication, object, singleAttributeList);            if (logger.isDebugEnabled()) {                logger.debug("Voter: " + voter + ", returned: " + result);            }            switch (result) {            case AccessDecisionVoter.ACCESS_GRANTED:                grant++;                break;            case AccessDecisionVoter.ACCESS_DENIED:                //只要有投票者投反对票就立马判为无权访问                throw new AccessDeniedException(messages.getMessage(                        "AbstractAccessDecisionManager.accessDenied",                        "Access is denied"));            default:                abstain++;

上一篇:使用icon替换你的网页图标(转)
下一篇:Vim安装jedi-vim提示的一个错误

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款