初尝spring security

msn spaces 对safiari的支持好像不好,每次写日志比较麻烦,所以决定把技术有关的日志移到csdn,就从这篇文章开始.这段时间一直在想权限的设计问题,网络上很多讨论这个问题的文章,看过一些,但仍然觉得没想到最好的办法,期间看到了有关acegi的介绍,他是spring下面的一个子项目,专门解决权限控制的问题,现在已经变为spring security.

权限问题说简单也简单,说难也难.一个简单的权限系统可能只是控制url的权限,就是说用户登录后,你只要读出这个用户对应的角色,以及这个角色对应的可以访问的url,然后在系统的菜单中展现就可以了.没有权限的菜单项不显示.

但是复杂的权限系统也会比较复杂,粒度更细,所设计的权限比简单的增删改查更多,比如工作流的权限,有写时候甚至涉及到委托权限,那么在设计的过程中如何做到权限控制的功能的同时考虑到通用性,用户配置的简单,以及程序的效率还是比较困难的.有空会专门写个权限控制的程序比在日志中做个总结.

这篇文中的主要目的还是我初尝spring security的一些体会,与总结.

用过acegi的人可能都会觉得里面的配置比较麻烦,在spring security中或多或少的得到了一些改进.因为在spring2.0中引入了XML Schema的namespace,而不是原来的DTD,所以在spring security中可以定义自己的一些xml语法,而不是原来的一串bean.但我仍然认为他的配置有点复杂.

1) 首先当然是web.xml的配置:

<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>

DelegatingFilterProxy是spring中的一个类,他负责决定filter的实现类,在这里这个实现类是springSecurityFilterChain.所以在这里springSecurityFilterChain的名字不能改变.

2) 接下来就是最重要的<http>节点的配置了:

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

这里配置了受保护的url,以及可以对其访问的角色,实际上<http>节点有很多的配置项,因为auto-config="true"所以都设为了默认的配置,下面是<http>节点的一些配置:

<http> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login /> <anonymous /> <http-basic /> <logout /> <remember-me /> </http>

这里就不详细解释每个配置了.配置完<http>节点后需要配置UserDetailsService,如果你使用auto-config="true"而不配置UserDetailsService的话,系统会报错.

Usernames/Passwords are rod/koala dianne/emu scott/wombat peter/opal --> <authentication-provider> <password-encoder hash="md5"/> <user-service> <user name="rod"password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" /> <user name="dianne" password="65d15fe9156f9c4bbffd98085992a44e" authorities="ROLE_USER,ROLE_TELLER" /> <user name="scott" password="2b58af6dddbd072ed27ffc86725d7d3a" authorities="ROLE_USER" /> <user name="peter" password="22b5c9accc6e1ba628cedc63a72d57f8" authorities="ROLE_USER" /> </user-service> </authentication-provider>

这里定义了用户名以及密码,以及所属的角色.一般应用这些信息都是从数据库读出的.那么你可以自己实现UserDetailsService

<authentication-provider user-service-ref='myUserDetailsService'/> <beans:bean id="myUserDetailsService" class="org.springframework.security.userdetails.jdbc.JdbcDaoImpl"> <beans:property name="dataSource" ref="dataSource"/> </beans:bean>

或者

<authentication-provider> <jdbc-user-service data-source-ref="securityDataSource"/> </authentication-provider>

这里我们已经有了最简单的权限控制,可以控制某个角色可以访问的url,如果你没有权限则会提示你登录,如果你没有配置<form-login />的话,spring会自己给你提供一个登录框.到这里再比较一下我们自己的应用,有个问题:

用户的信息,属于的角色肯定是应该在数据库或者目录中的,spring security中要怎么做才能和自己系统的数据库表设计结合起来.

这个需要继续研究下.

接下来,我们能够控制url了,那么我们想提供更细粒度的权限控制该怎么办,spring security提供对方法的控制:

<global-method-security secured-annotations="enabled"> <protect-pointcut expression="execution(* org.springframework.samples.petclinic.Clinic.storeVisit(..))" access="ROLE_SUPERVISOR"/> </global-method-security>

意思是只有ROLE_SUPERVISOR角色的用户可以执行storeVisit方法.如果没有权限会给出无权限页面.

问题和上面一样,我要把这个存储在数据库中的话怎么办?

我们可以在也面上就对其做出限制:

<sec:authorize ifAllGranted="ROLE_SUPERVISOR"> <form method="GET" action="<c:url value="/addVisit.do"/>" name="formVisitPet${pet.id}"> <input type="hidden" name="petId" value="${pet.id}"/> <p class="submit"><input type="submit" value="Add Visit"/></p> </form> </sec:authorize>这样,有权限的用户才看得到这个按钮

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值