* 关于授权
AcessDecisionManager是管授权的。具体授权(authorization)的工作是交给一系列Voter来做的。每个Voter都实现AccessDecisionVoter接口的vote方法,返回
int ACCESS_GRANTED = 1;(投赞成票)
int ACCESS_ABSTAIN = 0;(投弃权票)
int ACCESS_DENIED = -1; (投反对票)
AccessDecisioinManager有三种实现:
AffirmativeBased -当至少有一个投票者投允许访问票时允许访问
ConsensusBased - 当所有投票者都投允许访问票时允许访问
UnanimousBased - 当没有投票者投拒绝访问票时允许访问
Spring Security提供了一个实用的voter:
RoleVoter participates in a vote when the secured resource has a configuration attribute whose name starts with ROLE_.
* 关于保护web
Spring Security提供一套filter chain保护web应用
注意FilterToBeanProxy
<filter>
<filter-name>Spring Security Filter Chain Proxy</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
跑下题,说FilterToBeanProxy的作用:filter配置在web.xml里,它是不可能有IOC的概念的,服务没办法自动注射到filter中,这时候有一个办法就是使用WebApplicationContextUtils(如WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean("securityManager"))。按照SpringSide的说法,WebApplicationContextUtils适合厨房,卫生间,草坪,屋顶等非常规场所,汗…这么做的一个缺点是,Spring的API还是入侵到你的code里了(向来对Rod Johnson的入侵论不感冒,感觉这纯是顺手拽过来揍EJB的板砖,不值得深究,pojo粉丝估计要拍我板砖了,俺穿个软猬甲先。入侵论深入人心之后,大家反而愿意对Spring的偶尔入侵指指点点。另外不喜欢Spring的两个方面是,从DDD的角度看Spring不natural;contract first我觉得是扯淡的,或许在之后的博客乱喷一下我的看法)解决入侵的方法就是FilterToBeanProxy, 它把真正的工作代理给target class,而spring拿到target class的类名后,就归它管了。 proxy是个简单的模式,但用在这里感觉还是挺巧妙的。
回到正题,filter chain里至少包括四个filter:
Integration Filter - 拿之前的authentication, 通常是从session里拿。
AuthenticationProcessing Filter - 处理authentication request, 比如登录的时候
Exception Translation Filter - 典型的处理是,把AuthenticationException转登录页,把AccessNeniedException转403错误页
Filter Security Interceptor - 它是真正做权限处理的,把AuthenticaionManager 和AccessDecisionManager串起来.所以FilterSecurityInterceptor是重点。
先看一个配置示例:
1: <beans:bean id="resourceSecurityInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
2: <beans:property name="authenticationManager" ref="authenticationManager"/>
3: <beans:property name="accessDecisionManager" ref="accessDecisionManager"/>
4: <beans:property name="objectDefinitionSource" ref="secureResourceFilterInvocationDefinitionSource" />
5: <beans:property name="observeOncePerRequest" value="false" />
6: <custom-filter after="LAST" />
7: </beans:bean>
这里objectDefinitionSource属性来定义受保护的资源,保护web的时候,“资源”代表url. 保护method的时候,资源就代表method, 关于保护method之后再讨论。【有取舍地引用 spring security学习总结】首先让我们来认识一下系统为我们提供的 ObjectDefinitionSource接口,objectDefinitionSource属性正是指向此接口的实现类。其中有个重要方法,ConfigAttributeDefinition getAttributes(Object object)方法用户获取保护资源对应的权限信息,该方法返回一个ConfigAttributeDefinition对象,该对象中实际就只有一个List列表,我们可以通过使用 ConfigAttributeDefinition类的构造函数来创建这个List列表,这样,安全拦截器就通过调用 getAttributes(Object object)方法来获取ConfigAttributeDefinition对象,并将该对象和当前用户拥有的Authentication对象传递给 accessDecisionManager,accessDecisionManager再将其传递给voter们,这些投票者从ConfigAttributeDefinition对象中获取这个存放了访问保护资源需要的权限信息的列表,然后遍历这个列表并与Authentication对象中GrantedAuthority[]数据中的用户权限信息进行匹配,如果匹配成功,投票者就会投赞成票,否则就投反对票,最后accessDecisionManager来统计这些投票决定用户是否能访问该资源。【有取舍地引用 spring security学习总结结束】如果你用的是role voter的话,那么返回的ConfigAttributeDefinition其实就是一系列Role_XXX
说到这里小结一下之前说的认证,授权和"保护web”,涉及三个概念,user, role, resource. 认证的过程是鉴定你的身份,并且顺便把role也关联上。user和role是多对多的。 授权是处理role和resource之间的关系的,也是多对多。典型的resource是servlet URL路径。从实战的角度讲,authentication需要我们自己做的有两个事情:一是通过实现UserService.loadUserByUsername(String userName)完成认证的本职工作;二是通过实现Users.getAuthorities()把user和role关联起来。
* 保护方法:
Spring提供了两种方式保护方法,一种是AOP,另一种是annotation.
AOP:
如果你已经看懂了上面关于objectDefinitionSource的介绍和小结部分,那么直接看配置应该很容易可以看懂:
1:
2: <bean id="autoProxyCreator"
3: class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
4:
5: <property name="interceptorNames">
6:
7: <list>
8:
9: <value>securityInterceptor</value>
10:
11: </list>
12: </property>
13: <property
14: name="beanNames">
15:
16: <list>
17:
18: <value>courseService</value>
19:
20: <value>billingService</value>
21:
22: </list>
23: </property>
24: </bean>
25:
26: <bean id="securityInterceptor"
27:
28: class="org.acegisecurity.intercept.method.MethodSecurityInterceptor">
29:
30: <property name="authenticationManager">
31: <ref
32: bean="authenticationManager"/>
33: </property>
34:
35: <property name="accessDecisionManager">
36: <ref
37: bean="accessDecisionManager"/>
38: </property>
39:
40: <property name="objectDefinitionSource">
41:
42: <value>
43:
44: com.springinaction.springtraining.service.CourseService.createCourse=ROLE_ADMIN
45:
46: com.springinaction.springtraining.service.CourseService.enroll*=ROLE_ADMIN,ROLE_REGISTRAR
47:
48: </value>
49: </property>
50: </bean>
注意上面的倒数几行定义了方法和对应的role
annotation:
最终目标是通过这种方式定义权限
1: /**
2: * @@org.acegisecurity.SecurityConfig("ROLE_ADMIN")
3: * @@org.acegisecurity.SecurityConfig("ROLE_REGISTRAR")
4: */
5: public void enrollStudentInCourse(Course course, Student student) throws CourseException;
这个看起来很酷,但是有个drawback是,如果你做的是产品,并且允许用户灵活配置role和method(capability)的功能,那么annotation就不适用了,因为annotation是写死在code里的,compile time已经把role和method之间的map写死了。
这个没啥理论逻辑可谈,直接贴spring in action的配置:
原文地址: http://www.blogjava.net/vcycyv/archive/2011/03/14/346178.html
1:
2: <bean
3: id="attributes"class="org.springframework.metadata.commons.CommonsAttributes"/>
4:
5: <bean id="objectDefinitionSource"
6: class="org.acegisecurity.intercept.method.MethodDefinitionAttributes">
7:
8: <property name="attributes"><ref
9: bean="attributes"/></property>
10: </bean>
11:
12: <bean id="securityInterceptor"
13:
分享到:
相关推荐
总结,Spring Security通过数据库存储授权信息,使得安全配置更加灵活,同时降低了维护成本。通过自定义`UserDetailsService`和数据库表结构,可以实现用户认证和授权的完全数据库化管理。这种模式适用于大型和复杂...
为了演示Spring Security的配置和使用,我们可以构建一个简单的Web项目,使用MyEclipse导入Spring和Spring Security的相关JAR包,然后配置Spring Security来保护Web资源。在本例中,用户信息(用户名、密码和权限)...
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、授权和访问控制功能。在本文中,我们将深入探讨SpringSecurity的核心概念、关键组件以及如何配置和使用这个框架。 首先,Spring...
Spring Security Web是Spring Security框架的重要组成部分,它主要负责Web应用程序的安全性,包括认证和授权等核心功能。本文将深入探讨Spring Security Web的源码,并介绍与其密切相关的jar包及其作用。 首先,...
Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户身份的验证,以确保用户的...
Spring Security OAuth2是一个强大的安全框架,它为Web应用程序提供了安全认证和授权的功能。OAuth2则是一种开放标准,允许用户授权第三方应用访问他们存储在另一服务提供商的数据,而无需分享他们的用户名和密码。...
Spring Security之所以在Java社区中广泛流行,是因为它不仅提供了强大的安全特性,还具有高可定制性、良好的扩展性和兼容性,使得开发者可以根据具体需求选择合适的安全解决方案。而随着Web应用程序的安全要求越来越...
总而言之,通过学习Spring Security OAuth2.0,开发者能够掌握一套完整的认证授权解决方案,从而为Web应用和API提供安全的访问控制。这个讲义结合代码的实践学习将帮助你深入理解并熟练运用这些概念。
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...
Spring Security 提供基于角色的访问控制(RBAC),允许开发者定义安全角色和权限,并通过`@Secured`、`@PreAuthorize`、`@PostAuthorize`等注解实现方法级别的细粒度授权。 3. **过滤器链**:Spring Security 的...
- **安全和 AOP 建议**:Spring Security 提供了 AOP 支持,可以用来在运行时动态地决定是否允许执行特定的方法调用。 - **安全对象和 AbstractSecurityInterceptor**:提供了抽象的安全拦截器,可以用于拦截方法...
而Spring Security 则是 Java 开发中广泛使用的安全框架,用于实现认证和授权。当我们将这两者结合时,我们可以创建一个强大的统一登录认证鉴权系统。 首先,让我们深入了解Spring Cloud Gateway。这是一个基于...
7. **集成Spring MVC**:Spring Security 3.1与Spring MVC无缝集成,可以方便地保护Web控制器和视图。通过注解,如`@Secured`和`@PreAuthorize`,可以在方法级别声明安全约束。 8. **自定义逻辑**:Spring Security...
Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中,我们将深入探讨Spring Security的核心概念以及如何将其应用于实际的Web应用程序开发。 首先,我们从用户、...
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
在`SpringSecurity.md`和`SpringSecurity.pdf`文档中,可能包含SpringSecurity配置、自定义用户服务、授权策略等方面的代码示例。`codes`目录可能包含实际运行的项目代码,方便读者实践和理解。 8. **图笔记.draw...
例如,`spring-security-core`负责基本的认证和授权逻辑,`spring-security-web`处理与Web安全相关的请求过滤,而`spring-security-config`则简化了在Spring应用上下文中定义安全规则的过程。 使用时,开发者可以...
它为Web应用提供了全面的保护,防止未经授权的访问和操作。在版本2.5时,Spring Security已经是一个成熟且功能丰富的安全框架,为开发者提供了一套强大的工具来管理用户的登录、权限控制以及会话管理。 在"spring ...
在演讲结束后,演讲嘉宾张明星还预留了时间进行现场问答,解答了观众关于Spring Security的实际应用和技术细节等问题。 ### 总结 通过这次演讲,我们可以看出Spring Security 2.x不仅在功能上强大,而且在灵活性和...