`
guoyiqi
  • 浏览: 1001924 次
社区版块
存档分类
最新评论

权限控制:spring 3.0 security配置例子

阅读更多

我几年前自己写过一个后台权限管理的东西,也是基于用户-角色-权限这样的结构,说实话代码结构写得不好,因为是硬编码的形式,虽然功能其实用起来还是挺好用的,用户、角色及权限的管理均可在后台轻松完成,但现在如果再用硬编码的形式写这样的系统就说不过去了。目前关于权限管理的java开源系统比较多,有的比较有名,有的不出名,比如像Spring Security就很出名,在权限管理方面做得也非常全面,子猴这篇文章也是对Spring Security做个简短介绍。

我以最新版的spring-security-3.0.2作为介绍对象,如果你了解Spring 2.0 Security的话,那就比较抱歉了,因为spring-security-3.0.2与2.0相比改动很大,在2.0中的一些配置拿到3.0几乎是行不通的,如果你还没有接触过spring,那么以下是其地址:

Spring官方网址:http://www.springsource.org/

spring-security下载地址:

http://static.springsource.org/spring-security/site/downloads.html

我以其自带的一个简单例子来介绍一下吧,因为这个例子配置不对的话极易报错(这个例子是个打包的War文件,但与文档中的又不一样,所以极易出错),我会对出现的错误给予出错原因及解决方法。

首先通过spring-security地址下载到最新版的spring-security-3.0.2.RELEASE.zip,然后解压开来,在解压开的目录dist中,你会看到如下一些文件:

看到spring-security-samples-tutorial-3.0.2.RELEASE.war了吗?我就以这个为例,把这个包拷贝到你Web服务器(如Tomcat)的webapps目录下,启动服务器后,会生成一个spring-security-samples-tutorial-3.0.2.RELEASE项目,可以把名字改短一点方便访问,比如我这里改名为:spring-security,这样通过http://127.0.0.1/spring-security可以直接访问了。

进入目录WEB-INF,可以看到如上的一些文件,其中,applicationContext-security.xml是权限控制配置文件,所有的权限控制都是在其中配置的,bank-servlet.xml是系统的上下文配置文件,可以在其中配置访问路径映射(类似于Struts-1.x中的struts-config.xml或struts-2.x中的struts.xml文件),也可以在其中进行一些装配等工作,属于spring级的,与安全配置没多大关系。

具体的文件内容我就不展示了,因为可以自己打开看,我这里只说要注意的一些地方:

1、在web.xml中的配置

服务启动时加载applicationContext-security.xml文件:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/applicationContext-security.xml

</param-value>

</context-param>

要过滤链接的形式

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>

<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

你一定注意到了,这里的filter-class与Spring2.0的不同之处,如果你了解Spring2.0的话,的确,在Spring2.0中为:

<filter-name>acegiFilterChain</filter-name>

<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>

这就是3.0与2.0改变很大的一个地方,2.0用的为Acegi,后来Acegi嵌入到了Spring中,成为了Spring Security,所以包的路径也都改变了!

2、在applicationContext-security.xml中的配置
<http use-expressions=”true”>

<intercept-url pattern=”/secure/extreme/**” access=”hasRole(‘ROLE_SUPERVISOR’)”/>

<intercept-url pattern=”/secure/**” access=”isAuthenticated()” />

<!– Disable web URI authorization, as we’re using <global-method-security> and have @Secured the services layer instead

<intercept-url pattern=”/listAccounts.html” access=”isRememberMe()” />

<intercept-url pattern=”/post.html” access=”hasRole(‘ROLE_TELLER’)” />

–>

<intercept-url pattern=”/**” access=”permitAll” />

<form-login />

<logout />

<remember-me />

<!–

Uncomment to enable X509 client authentication support

<x509 />

–>

<!– Uncomment to limit the number of sessions a user can have –>

<session-management invalid-session-url=”/timeout.jsp”>

<concurrency-control max-sessions=”1″ error-if-maximum-exceeded=”true” />

</session-management>

</http>
上面这段是初用者比较容易出错的地方,这其实也是写这篇文章的主要原因之一,注意到第一行的黑体字:

<http use-expressions=”true”>

表示这里的配置可以使用一种表达式,这种表达式就是类似于isAuthenticated()这样的写法,在后面会看到与这种写法不一样但同样可以达到相同效果的写法。

intercept-url表示要拦截的url形式,比如

<intercept-url pattern=”/secure/**” access=”isAuthenticated()” />

表示根目录下的secure目录需要经过验证后才能访问的。

<form-login />是Spring Security自动为你生成的一个简陋的登录页面,即使你没有创建任何登录页面,当然你也可以修改,但不建议你修改,因为你可以不使用默认的,可以采用如下方式:<form-login login-page=’/ login.html’/>自定义一个登录页面。

其他的说明可以参考一个翻译的中文文档:

http://www.family168.com/tutorial/springsecurity3/html/ns-config.html

3、容易出错的地方

在上面的翻译文档(也是翻译自官方文档)或英文官方文档中,给出的与上面例子功能相似的说明大概是这样的:

  <http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_USER" />
  </http>

注意到与上面例子不同的地方了吗?

还是注意第一行,这回不是<http use-expressions=”true”>而是<http auto-config=’true’>了,而下面的配置

<intercept-url pattern=”/**” access=”ROLE_USER” />也与上面的写法不同,事实上如果是<http use-expressions=”true”>的话,这句access=”ROLE_USER”就是错的,正确的写法就应该为:hasRole(‘ROLE_USER’)。

这不得不说这是Spring Security的文档与例子不搭配的一个低级错误,因为当一个使用者在打开例子又看到文档说明时,他往往不知道这两者有何区别,就如同我刚使用的时候一样,我在使用<http use-expressions=”true”>的同时,将access=”ROLE_USER”这种写法也写了进来,结果可想而知,报了错!报错信息诸如:
org.apache.jasper.JasperException: java.lang.IllegalArgumentException: Failed to evaluate
expression ‘ROLE_SUPERVISOR’
就是说use-expressions这种表示法是不认识access=”ROLE_USER”这种写法的,另外,当使用了<http use-expressions=”true”>时,一定要在配置中至少有一个符合use-expressions的表示法,否则就会报类似如下错误:
org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property
‘ROLE_SUPERVISOR’ cannot be found on object of type ‘org.springframework.security.web.access.
expression.WebSecurityExpressionRoot’
这个简单的配置例子大概就写这么多吧,最后说说我对Spring Security的看法,我个人觉得Spring Security的功能的确是很强大,考虑得也非常全面,几乎什么都想替使用者做完,但正是它的这点,我觉得倒是它的缺点,在我了解它并配置的过程中,我个人觉得是非常复杂繁琐的,而且它现在的文档支持也并不好,正如上面所看到的一样,文档与例子中的写法都不一致。事实上,使用者并不希望它什么都做到,比如它做的那个缺省登录页面,那个有意义吗?使用者比如我,其实就是希望一个很简单的权限判断,比如我打开某一个链接,然后你告诉我访问者有无权限访问,给我返回一个类似true或false的结果就够了!至于其他的事情,我是如何的处理后续过程并不用Spring Security操心的

分享到:
评论
2 楼 guoyiqi 2012-03-30  
g371820621 写道
我只想要个这样的例子。某个用户登录进去。只能操作自己分配的那个栏目的内容

试一下标签
<shiro:lacksPermission name="权限名称">无审批权限</shiro:lacksPermission>
1 楼 g371820621 2012-03-27  
我只想要个这样的例子。某个用户登录进去。只能操作自己分配的那个栏目的内容

相关推荐

    Spring_security例子源码

    5. **表达式式访问控制**:Spring Security 3.0引入了基于Spring EL(Expression Language)的访问控制,允许更灵活的权限表达式,如`hasRole('ROLE_ADMIN')`或`isFullyAuthenticated()`。 6. **异常处理**:当访问...

    spring security3配置和使用实例+教程

    教程文档`教你使用_SpringSecurity_3.0_52页.pdf`会详细指导你如何一步步配置和使用Spring Security。它应该包含了配置文件的示例、如何集成到Spring应用中、如何创建自定义认证逻辑以及如何进行授权设置等内容。...

    springSecurity3例子

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它为Web应用程序提供了全面的身份验证、授权和访问...在实际项目中,结合具体需求,正确配置和使用Spring Security,能有效提高应用程序的安全性。

    spring3.0+mybatis3.0+springSecurity+SpringMVC

    这个是基于Spring的一个小例子 , 主要是为了帮助大家学习SpringSecurity和SpringMvc 和Mybatis3.0 1.SS不用再数据库建表 2.使用了SS提供的登录方式,在输入用户名和密码时,访问到服务器后台 3.判断如果是用户名是...

    Spring3.0 rest 实例

    **Spring 3.0 REST 实例详解** 在现代Web开发中,REST(Representational State Transfer,表述性状态转移)已经成为构建API的首选架构风格。Spring框架,作为一个强大的Java企业级应用开发框架,从3.0版本开始就...

    spring security3配置

    ### Spring Security 3 配置详解 #### 一、引言 ...本文通过具体的例子详细介绍了如何配置Spring Security 3以实现动态权限管理。通过这种方式,可以有效地增强应用程序的安全性和灵活性,同时降低维护成本。

    spring_security_demo

    在Spring Security 3.0中,动态权限控制意味着权限和角色的分配可以通过数据库来实现,而不是硬编码在配置文件中。这提供了更大的灵活性,使得管理员可以在运行时更改用户的权限。 1. **权限实体**:在数据库中创建...

    Spring_Security-3.0.1_中文自学教程.pdf

    Spring Security 3.0.1 是基于 Spring Security 3.0 的一个 bug fix 版本,主要修复了 3.0 中已知的问题,并对文档中的一些拼写错误进行了修正。 ##### 1.4 如何获取 Spring Security - **项目模块**:Spring ...

    Spring Security 3.0.1 pdf 中文参考文档

    - **内容:** 包含了一个简单的 Spring Security 应用程序示例,用于演示如何配置和使用 Spring Security。 **3.2 Contacts** - **内容:** 介绍如何在 Spring Security 中配置联系人管理功能。 **3.3 LDAP 例子**...

    用SpringSecurity保护Web的安全

    在SpringSecurity 3.1版本中,相比3.0版本,配置上有一些变化,但其核心仍然是通过一系列过滤器来实现安全控制。本文将详细介绍SpringSecurity的体系结构、配置以及在非数据库环境下进行安全保护的基本步骤。 1. **...

    spring最新配置

    在这个例子中,我们聚焦于Spring框架的核心配置概念,以及如何在实际项目中进行设置。 首先,Spring的核心配置通常涉及到`beans.xml`或`applicationContext.xml`文件,这些XML文件定义了应用程序的bean及其依赖关系...

    使用acegi控制用户权限实例

    因此,如果是在新项目中实现权限控制,建议使用 Spring Security。 在提供的压缩文件“acegi”中,可能包含了 Acegi 框架的源码或示例代码,这将有助于你深入理解其内部工作原理和实现细节。你可以通过阅读这些源码...

    过滤器实现多层权限控制

    Spring Security可以与Spring MVC无缝集成,通过注解和配置即可完成复杂的权限逻辑。 综上所述,过滤器在实现多层权限控制中起到了关键作用。它们可以独立地检查不同的安全条件,形成灵活的过滤链,确保系统的安全...

    sprinng in action 3

    9. 全面介绍Spring:文档中提到本书是Spring的总体介绍,意味着书中不仅仅局限于Spring框架的某一部分,而是提供了全面的覆盖,包括了Spring的各个方面,比如Spring MVC、Spring Security、Spring Data、Spring Boot...

    filter 过滤用户权限

    除了基本的登录检查,Filter还可以结合其他安全框架如Spring Security,实现更复杂的权限控制,比如角色授权、权限细粒度控制等。Spring Security提供了一套完善的权限管理机制,可以通过自定义Filter或者继承其提供...

    cas client

    2. 配置文件:在Spring Boot项目中,通常会有一个`application.properties`或`application.yml`文件,用于配置CAS客户端的相关参数,如CAS服务器的URL、服务验证端点、安全相关的属性等。 3. 登录与票证验证:当...

    OpenAPI3SecurityHeader

    在Java代码中,使用Spring Security可以这样配置: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure...

    自己整理的flex与java结合的学生管理系统-很好的入门及提升的例子

    在Flex中,可以使用SecurityModule来实现用户验证,而在Java后端,可以使用Spring Security等框架进行权限管理。 7. RESTful API:虽然本例主要使用了Remoting(AMF)通信,但现代Web应用也常采用RESTful API设计,...

Global site tag (gtag.js) - Google Analytics