前言
要使用Spring Sercurity3.1框架,只需要在官网上去下载http://www.springsource.org/spring-community-download Spring Security包,里面有两个例子程序,把其中一个例子程序中的Lib里面的包考到自己的项目中就可以开发了。在这个包倒入的时候可能会遇到一些麻烦,比如包冲突,解决办法就是把包名相同版本不同的删掉一个就可以了。
原理
权限管理一般涉及到用户、角色、资源这三者之间的关系,当用户请求某个资源时,先判断该用户的角色,然后判断请求资源所需的角色,最后把用户角色和资源角色作比较,如果相等,说明该用户拥有访问该资源的权限,如果用户角色用没有一个和该资源角色相等,说明该用户没有访问该资源的权限。Spring Sercurity3.1框架实现权限管理也是这个原理,当我们项目编译时,Spring Security会自动的启动它的过滤器把我们数据库中的用户和角色加载出来。
概述
Spring Sercurity要从数据库中获取用户、权限、资源来实现权限管理,需要自定义过滤器,并且该过滤器必须在spring Security执行FILTER_SECURITY_INTERCEPTOR过滤器之前执行,因为该框架实现权限管理实质就是在执行action之前先执行它框架中的为权限管理制定的一系列Fliter。
我们自定的这个SercurityFilter类要继承AbstractSecurityInterceptor 接口和Filter类(负责传递一系列的Filter),因为我们是从数据库中获取权限验证的数据,所以还要重写FilterInvocationSecurityMetadataSource 接口,AccessDecisionManager 接口,UserDetailsService 接口,只要重写了这3个接口,然后再spring配置文件中做相应的配置,项目启动启动后,我们进行资源请求,就自动会去执行我们重定义的类进行权限判断。
实现:
1. web.xml代理配置
2. SpringContext-Security配置
3. 自定义的类说明
自定义MySecurityFilter需要继承AbstractSecurityInteceptor拦截器和继承Filter类,因为它本身就是一个过滤器,如下图所示:
自定义MySecurityMetadataSource需要继承FilterInvovationSecurityMetadataSource,改类主要是程序启动的时候加载资源与角色的对应关系,存放在一个map中。
自定义MyUserDetailServiceImpl需要继承UserDetailsService,该类的作用是,当用户登录后,获取用户的权限。
MyAccessDecisionManager类需要继承AccessDecisionManager,改类的作用是判断用户与访问的资源所需的权限是否相等,实现是在decide函数里面。
总结:
我们一般进行权限管理时可以采用第三方框架,因为它已为我们实现了很强大的功能,控制的粒度可以随心所欲,除了java有Spring Sercurity框架,各门语言我想都有它的一套权限管理的框架,这样让我们更加专注于业务的实现,减少开发时间。Spring Security框架网上也有很多全面的讲解,我也是最近看了很多资料才明白其使用