首先介绍下Spring的决策管理器,其接口为AccessDecisionManager,抽象类为AbstractAccessDecisionManager。而我们要自定义决策管理器的话一般是继承抽象类而不去直接实现接口。

在Spring中引入了投票器(AccessDecisionVoter)的概念,有无权限访问的最终觉得权是由投票器来决定的,最常见的投票器为RoleVoter,在RoleVoter中定义了权限的前缀,先看下Spring在RoleVoter中是怎么处理授权的。
public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {
int result = ACCESS_ABSTAIN;
Collection<? extends GrantedAuthority> authorities = extractAuthorities(authentication);
for (ConfigAttribute attribute : attributes) {
if (this.supports(attribute)) {
result = ACCESS_DENIED;
// Attempt to find a matching granted authority
for (GrantedAuthority authority : authorities) {
if (attribute.getAttribute().equals(authority.getAuthority())) {
return ACCESS_GRANTED;
}
}
}
}
return result;
}
Collection<? extends GrantedAuthority> extractAuthorities(Authentication authentication) {
return authentication.getAuthorities();
}
Authentication中是用户及用户权限信息,attributes是访问资源需要的权限,然后循环判断用户是否有访问资源需要的权限,如果有就返回ACCESS_GRANTED,通俗的说就是有权限。
Spring提供了3个决策管理器,至于这三个管理器是如何工作的请查看SpringSecurity源码
AffirmativeBased 一票通过,只要有一个投票器通过就允许访问
ConsensusBased 有一半以上投票器通过才允许访问资源
UnanimousBased 所有投票器都通过才允许访问
下面来实现一个简单的自定义决策管理器,这个决策管理器并没有使用投票器
public class DefaultAccessDecisionManager extends AbstractAccessDecisionManager {
public void decide( Authentication authentication, Object object,
Collection<ConfigAttribute> configAttributes)
throws AccessDeniedException, InsufficientAuthenticationException{
SysUser user = (SysUser)authentication.getPrincipal();
logger.info("访问资源的用户为"+user.getUsername());
//如果访问资源不需要任何权限则直接通过
if( configAttributes == null ) {
return ;
}
Iterator<ConfigAttribute> ite = configAttributes.iterator();
//遍历configAttributes看用户是否有访问资源的权限
while( ite.hasNext()){
ConfigAttribute ca = ite.next();
String needRole = ((SecurityConfig)ca).getAttribute();
//ga 为用户所被赋予的权限。 needRole 为访问相应的资源应该具有的权限。
for( GrantedAuthority ga: authentication.getAuthorities()){
if(needRole.trim().equals(ga.getAuthority().trim())){
return;
}
}
}
throw new AccessDeniedException("");
}
}
decide这个方法没有任何的返回值,需要在没有通过授权时抛出AccessDeniedException。
如果有访问某个资源需要同时拥有两个或两个以上权限的情况,这时候就要通过自定义AccessDecisionVoter来实现了,这个也很简单在这里就不赘述了。如果要在页面中使用hasRole()这样的表达式就需要注入WebExpressionVoter了。
在SpringSecurity中自定义权限前缀
权限的前缀默认是ROLE_,网上的很多例子是说,直接在配置文件中加上下面的配置就可以了。
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter"> <property name="rolePrefix" value="AUTH_"></property> </bean>
亲测不管用的,我想应该不是我配置的问题,而是在我们配置了http auto-config="true"Spring就已经将AccessDecisionManager初始化好了,即便配置到之前也不行,因为这个初始化是Spring自己来完成的,它并没有把你配置的roleVoter注入到AccessDecisionManager中。那我们就来手动的注入AccessDecisionManager吧。
在http配置中有个access-decision-manager-ref属性,可以使我们手动注入AccessDecisionManager,下面是详细配置
<sec:http auto-config="true" access-decision-manager-ref="accessDecisionManager">
<sec:access-denied-handler ref="accessDeniedHandler"/>
<sec:session-management invalid-session-url="/login.jsp" />
<sec:intercept-url pattern="/app.jsp" access="AUTH_GG_FBGBGG"/>
<sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />
<sec:form-login login-page="/login.jsp" authentication-failure-url="/login.jsp"
default-target-url="/index.jsp"/>
</sec:http>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<constructor-arg name="decisionVoters">
<list>
<ref bean="roleVoter"/>
<ref bean="authenticatedVoter"/>
</list>
</constructor-arg>
<property name="messageSource" ref="messageSource"></property>
</bean>
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter">
<property name="rolePrefix" value=""></property>
</bean>
<bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter" />
在这里我们就不用自定义的AccessDecisionManager了,直接用Spring的AffirmativeBased,因为Spring本身提供的这些决策管理器就已经很强大了。
配置很简单,要想修改权限的前缀只需要修改roleVoter中的rolePrefix就可以了,如果不要前缀就让它为“”。
authenticatedVoter是为了支持IS_AUTHENTICATED这种认证,authenticatedVoter提供的3种认证,分别是
IS_AUTHENTICATED_ANONYMOUSLY 允许匿名用户进入
IS_AUTHENTICATED_FULLY 允许登录用户进入
IS_AUTHENTICATED_REMEMBERED 允许登录用户和rememberMe用户进入
总结
以上所述是小编给大家介绍的spring security自定义决策管理器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# spring
# security自定义
# security决策管理器
# Spring Boot中整合Spring Security并自定义验证代码实例
# java中自定义Spring Security权限控制管理示例(实战篇)
# spring security自定义登录页面
# spring security自定义认证登录的全过程记录
# 管理器
# 自定义
# 在这里
# 小编
# 就可以
# 我想
# 好了
# 有个
# 抽象类
# 在此
# 的说
# 就不
# 是由
# 没有任何
# 是怎么
# 遍历
# 不去
# 要在
# 把你
# 也很
相关文章:
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
香港服务器租用每月最低只需15元?
建站之星后台密码遗忘?如何快速找回?
如何用5美元大硬盘VPS安全高效搭建个人网站?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
如何在橙子建站中快速调整背景颜色?
Android使用GridView实现日历的简单功能
盐城做公司网站,江苏电子版退休证办理流程?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
如何选购建站域名与空间?自助平台全解析
建站之星如何实现五合一智能建站与营销推广?
如何通过万网虚拟主机快速搭建网站?
完全自定义免费建站平台:主题模板在线生成一站式服务
Android自定义listview布局实现上拉加载下拉刷新功能
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
非常酷的网站设计制作软件,酷培ai教育官方网站?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
建站之星在线客服如何快速接入解答?
魔方云NAT建站如何实现端口转发?
如何选择高效可靠的多用户建站源码资源?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
利用JavaScript实现拖拽改变元素大小
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何在橙子建站上传落地页?操作指南详解
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何快速搭建高效可靠的建站解决方案?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何通过商城免费建站系统源码自定义网站主题?
如何用好域名打造高点击率的自主建站?
Swift中循环语句中的转移语句 break 和 continue
如何续费美橙建站之星域名及服务?
c# 在高并发场景下,委托和接口调用的性能对比
视频网站app制作软件,有什么好的视频聊天网站或者软件?
,网页ppt怎么弄成自己的ppt?
如何通过主机屋免费建站教程十分钟搭建网站?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
h5网站制作工具有哪些,h5页面制作工具有哪些?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
淘宝制作网站有哪些,淘宝网官网主页?
如何在阿里云高效完成企业建站全流程?
建站之星官网登录失败?如何快速解决?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
临沂网站制作企业,临沂第三中学官方网站?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
网站制作模板下载什么软件,ppt模板免费下载网站?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
如何通过远程VPS快速搭建个人网站?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
*请认真填写需求信息,我们会在24小时内与您取得联系。