Spring_Security_3_安全权限管理手册(最新)(20页).doc
-Spring_Security_3_安全权限管理手册(最新)-第 20 页Spring Security 3.0 安全权限管理手册参考文献:1、中的spring security权限管理手册。2、spring security3.0权限管理手册3、spring的相关资料。本文档内容仅作为公司权限管理资料用,对于企业来说,权限管理将是系统中的非常重要的一个模块,权限的设计也是参考相关资料进行整理和补充。系统将通过数据库进行管理用户权限。权限管理搭建要的问题:1、区分Authentication(验证)和 Authorization(授权)验证这个用户是谁?用户身份可靠吗?授权某用户A是否可以访问资源R某用户A是否可以执行M操作某用户A是否可以对资源R执行M操作2、SS中的验证特点支持多种验证方式支持多种加密格式支持组件的扩展和替换可以本地化输出信息3、SS中的授权特点支持多种仲裁方式支持组件的扩展和替换支持对页面访问、方法访问、对象访问的授权。4、SS核心安全实现Web安全通过配置Servlet Filter激活SS中的过滤器链实现Session一致性验证实现免登陆验证(Remember-Me验证)提供一系列标签库进行页面元素的安全控制方法安全通过AOP模式实现安全代理Web安全与方法安全均可以使用表达式语言定义访问规则5、配置SS配置Web.xml,应用安全过滤器配置Spring,验证与授权部分在web页面中获取用户身份在web页面中应用安全标签库实现方法级安全6、配置web.xml7、Spring配置文件中设置命名空间8、通过数据库验证用户身份9、完善web页面验证规则10、自定义验证配置11、本地化消息输出(国际化)根据公司项目的开发要求和集合spring security3.0功能,公司将通过数据库进行对用户身份验证和授权,系统将建立5个基础表进行对权利的管理。第一部分 数据库设计1、表设计表1:用户表(pub_users)序号字段类型含义备注1User_IdVchar(32)用户idPK2user_accountVchar(30)登陆用户名(登陆号)3User_nameVchar(40)用户姓名4user_PasswordVchar(100)用户密码5EnabledInt是否被禁用0禁用1正常6isSysInt是否是超级用户0非1是7user_DEScVchar(100)描述说明:pub_users表中的登录名和密码用来控制用户的登录。表2:权限表(pub_authorities)序号字段类型含义备注1authority_IdVchar(32)权限idPK2Authority_nameVchar(40)权限名称3Authority_DEScVchar(100)权限描述4EnabledInt是否被禁用0禁用1正常5isSysInt是否是超级权限0非1是说明:pub_authorities表中描述的是系统拥有哪些权限,如果要详细分类,可以将一个url定义一个权限,那样就能对所有资源进行管理。表3:角色表(pub_roles)序号字段类型含义备注1role_IdVchar(32)角色idPK2role_nameVchar(100)角色名称3role_DEScVchar(100)角色描述4EnabledInt是否被禁用0禁用1正常5isSysInt是否是超级权限0非1是说明:pub_roles表中描述的是系统按用户分类或按照功能模块分类,将系统进行整合归类管理。表4:资源表(pub_resources)序号字段类型含义备注1resource_IdVchar(32)资源idPK2resource_nameVchar(100)资源名称3resource _typeVchar(40)资源类型url、method4priorityint资源优先权即排序5resource _stringVchar(200)资源链接6resource_DEScVchar(100)资源描述7EnabledInt是否被禁用0禁用1正常8isSysInt是否是超级权限0非1是说明:pub_roles表中描述的是系统需要保护的资源及(url或方法)。以上四个表是权限管理的基础表(用户表、权限表、角色表、资源表)。表5:用户角色连接表(pub_users_roles)序号字段类型含义备注1IdIndetityId主键PK2user_IdVchar(32)用户id3role_idVchar(32)角色id说明:用来管理用户和角色的关系。表6:角色权限连接表(pub_roles_authorities)序号字段类型含义备注1IdIndetityId主键PK2role _IdVchar(32)角色id3authority_IdVchar(32)权限id说明:用来管理角色和权限的关系。表7:权限资源连接表(pub_authorities_resources)序号字段类型含义备注1IdIndetityId主键PK2authority_IdVchar(32)权限id3resource_IdVchar(32)资源id说明:用来管理角色和权限的关系。2、建表语句如下(数据库采用MS SQL 2000):create table pub_users( user_id varchar(32), user_account varchar(30), user_name varchar(40), user_password varchar(100), user_desc varchar(100), enabled int, issys intalter table pub_users add constraint pk_pub_users primary key(user_id);create table pub_authorities( authority_id varchar(32), authority_name varchar(40), authority_desc varchar(100), enabled int, issys intalter table pub_authorities add constraint pk_pub_authorities primary key(authority_id);create table pub_roles( role_id varchar(32), role_name varchar(40), role_desc varchar(100), enabled int, issys intalter table pub_roles add constraint pk_pub_roles primary key(role_id);create table pub_resources( resource_id varchar(32), resource_name varchar(100), resource_desc varchar(100), resource_type varchar(40), resource_string varchar(200), priority int, enabled int, issys intalter table pub_resources add constraint pk_pub_resources primary key(resource_id);create table pub_users_roles( id numeric(12,0) IDENTITY NOT NULL, user_id varchar(32), role_id varchar(32), enabled intalter table pub_users_roles add constraint pk_pub_users_roles primary key(id);alter table pub_users_roles add constraint fk_users_roles_users foreign key(user_id) references pub_users(user_id);alter table pub_users_roles add constraint fk_users_roles_roles foreign key(role_id) references pub_roles(role_id);create table pub_roles_authorities( id numeric(12,0) IDENTITY NOT NULL, role_id varchar(32), authority_id varchar(32), enabled intalter table pub_roles_authorities add constraint pk_pub_roles_authorities primary key(id);alter table pub_roles_authorities add constraint fk_pub_roles_authorities_authorities foreign key(authority_id) references pub_authorities(authority_id);alter table pub_roles_authorities add constraint fk_pub_roles_authorities_roles foreign key(role_id) references pub_roles(role_id);create table pub_authorities_resources( id numeric(12,0) IDENTITY NOT NULL, authority_id varchar(32), resource_id varchar(32), enabled intalter table pub_authorities_resources add constraint pk_pub_authorities_resources primary key(id);alter table pub_authorities_resources add constraint fk_pub_authorities_resources_authorities foreign key(authority_id) references pub_authorities(authority_id);alter table pub_authorities_resources add constraint fk_pub_authorities_resources_resources foreign key(resource_id) references pub_resources(resource_id);3、E-R图如下:第二部分 WEB数据库整合提示:相关代码请参考项目模块1、将数据库表结构和Hibernate建立映射,本系统采用annotation进行对数据库进行零配置处理(请参考hibernate映射),如图。2、建立权限的Dao层。3、建立权限的Service层4、配置web.xml <?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="xmlns:xsi="http:/www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=" <display-name>rstframe</display-name><context-param><param-name>webAppRootKey</param-name><param-value>rstframe.root</param-value></context-param><context-param><param-name>log4jConfigLocation</param-name><param-value>classpath:log4j.properties</param-value></context-param><context-param><param-name>log4jRefreshInterval</param-name><param-value>60000</param-value></context-param><!- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔此参数用于后面的Spring Context Loader -><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/applicationContext.xml,classpath*:/applicationContext-rstframe.xml</param-value></context-param><!- Character Encoding filter -><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!- SpringSide's Hibernate Open Session In View filter-><filter><filter-name>hibernateOpenSessionInViewFilter</filter-name><filter-class>com.rstco.frame.modules.orm.hibernate.OpenSessionInViewFilter</filter-class><init-param><param-name>excludeSuffixs</param-name><param-value>js,css,jpg,gif</param-value></init-param></filter><filter-mapping><filter-name>hibernateOpenSessionInViewFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!- SpringSecurity filter-> <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> <!- Struts2 filter, actionPackages -><filter><filter-name>struts2Filter</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping> <!-Spring的ApplicationContext 载入 -><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener><!- Spring 刷新Introspector防止内存泄露 -><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener><!- 防止多人登陆 ,控制一个用户只能登录一次,不能在其他地方重新登录-> <listener><listener-class>org.springframework.security.web.session.HttpSessionEventPublisher </listener-class></listener><!- session超时定义,单位为分钟 -><session-config><session-timeout>20</session-timeout></session-config><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!- error page -><error-page><exception-type>java.lang.Throwable</exception-type><location>/common/500.jsp</location></error-page><error-page><error-code>500</error-code><location>/common/500.jsp</location></error-page><error-page><error-code>404</error-code><location>/common/404.jsp</location></error-page><error-page><error-code>403</error-code><location>/common/403.jsp</location></error-page><jsp-config><taglib><taglib-uri>/WEB-INF/struts-menu-el.tld</taglib-uri><taglib-location>/WEB-INF/tlds/struts-menu-el.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-menu.tld</taglib-uri><taglib-location>/WEB-INF/tlds/struts-menu.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/c.tld</taglib-uri><taglib-location>/WEB-INF/tlds/c.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/fmt.tld</taglib-uri><taglib-location>/WEB-INF/tlds/fmt.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/fn.tld</taglib-uri><taglib-location>/WEB-INF/tlds/fn.tld</taglib-location></taglib><!-loushang tld-><taglib><taglib-uri>/WEB-INF/web-date.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-date.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-flex.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-flex.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-graph.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-graph.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-grid.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-grid.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-html.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-html.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-list.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-list.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-loushang.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-loushang.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-menu.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-menu.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-multitab.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-multitab.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-seltree.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-seltree.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-tab.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-tab.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-tree.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-tree.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-widgets.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-widgets.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/web-i18n.tld</taglib-uri><taglib-location>/WEB-INF/tlds/web-i18n.tld</taglib-location></taglib><!- loushang end-><taglib><taglib-uri>/WEB-INF/gystudio.tld</taglib-uri><taglib-location>/WEB-INF/tlds/gystudio.tld</taglib-location></taglib></jsp-config><mime-mapping><extension>rar</extension><mime-type>application/rar</mime-type></mime-mapping></web-app>5、配置spring security3.0中的xml文件 文件名:applicationContext-security.xml<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http:/www.springframework.org/schema/security" xmlns:beans="http:/www.springframework.org/schema/beans" xmlns:xsi="http:/www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/www.springframework.org/schema/beans http:/www.springframework.org/schema/beans/spring-beans-3.0.xsd http:/www.springframework.org/schema/security http:/www.springframework.org/schema/security/spring-security-3.0.xsd"><beans:description>SpringSecurity安全配置</beans:description><!- http安全配置 -> <http auto-config="true"><intercept-url pattern="/css/*" filters="none" /><intercept-url pattern="/images/*" filters="none" /><intercept-url pattern="/js/*" filters="none" /><intercept-url pattern="/login.jsp" filters="none" /><intercept-url pattern="/index.jsp" access="ROLE_USER"/><intercept-url pattern="/main.jsp" access="ROLE_ADAMIN"/><form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=1" /><!- 尝试访问没有权限的页面时跳转的页面 -> <access-denied-handler error-page="/common/403.jsp"/> <logout logout-success-url="/login.jsp" /> <session-management> <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </session-management><!- 增加一个filter,这点与Acegi是不一样的,不能修改默认的filter了,这个filter位于FILTER_SECURITY_INTERCEPTOR之前 -> <custom-filter ref="myFilter" before="FILTER_SECURITY_INTERCEPTOR"/> </http><!- 一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性, 我们的所有控制将在这三个类中实现,解释详见具体配置 -> <beans:bean id="myFilter" class="com.rstco.frame.pub.security.interceptor.MyFilterSecurityInterceptor"> <beans:property name="authenticationManager" ref="authenticationManager" /> <beans:property name="accessDecisionManager" ref="myAccessDecisionManagerBean" /> <beans:property name="securityMetadataSource" ref="mySecurityMetadataSource" /> </beans:bean><!- 验证配置 , 认证管理器,实现用户认证的入口,主要实现UserDetailsService接口即可 -> <authentication-manager a