- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章spring security自定义决策管理器由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
首先介绍下Spring的决策管理器,其接口为AccessDecisionManager,抽象类为AbstractAccessDecisionManager。而我们要自定义决策管理器的话一般是继承抽象类而不去直接实现接口.
在Spring中引入了投票器(AccessDecisionVoter)的概念,有无权限访问的最终觉得权是由投票器来决定的,最常见的投票器为RoleVoter,在RoleVoter中定义了权限的前缀,先看下Spring在RoleVoter中是怎么处理授权的.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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 所有投票器都通过才允许访问 。
下面来实现一个简单的自定义决策管理器,这个决策管理器并没有使用投票器 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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_,网上的很多例子是说,直接在配置文件中加上下面的配置就可以了.
1
2
3
|
<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,下面是详细配置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<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自定义决策管理器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:http://blog.sina.com.cn/s/blog_9c6852670102wwpc.html 。
最后此篇关于spring security自定义决策管理器的文章就讲到这里了,如果你想了解更多关于spring security自定义决策管理器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!