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的配置:
DelegatingFilterProxy是spring中的一个类,他负责决定filter的实现类,在这里这个实现类是springSecurityFilterChain.所以在这里springSecurityFilterChain的名字不能改变.
2) 接下来就是最重要的<http>节点的配置了:
这里配置了受保护的url,以及可以对其访问的角色,实际上<http>节点有很多的配置项,因为auto-config="true"所以都设为了默认的配置,下面是<http>节点的一些配置:
这里就不详细解释每个配置了.配置完<http>节点后需要配置UserDetailsService,如果你使用auto-config="true"而不配置UserDetailsService的话,系统会报错.
这里定义了用户名以及密码,以及所属的角色.一般应用这些信息都是从数据库读出的.那么你可以自己实现UserDetailsService
或者
这里我们已经有了最简单的权限控制,可以控制某个角色可以访问的url,如果你没有权限则会提示你登录,如果你没有配置<form-login />的话,spring会自己给你提供一个登录框.到这里再比较一下我们自己的应用,有个问题:
用户的信息,属于的角色肯定是应该在数据库或者目录中的,spring security中要怎么做才能和自己系统的数据库表设计结合起来.
这个需要继续研究下.
接下来,我们能够控制url了,那么我们想提供更细粒度的权限控制该怎么办,spring security提供对方法的控制:
意思是只有ROLE_SUPERVISOR角色的用户可以执行storeVisit方法.如果没有权限会给出无权限页面.
问题和上面一样,我要把这个存储在数据库中的话怎么办?
我们可以在也面上就对其做出限制:
这样,有权限的用户才看得到这个按钮