版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9.1.1SpringSecurity整体控制框架9.1.2SpringSecurity的过滤器HttpSessionContextIntegrationFilter:将安全上下文记录到Session中。LogoutFilter:处理用户注销请求。AuthenticationProcessingFilter:处理来自form的登录。DefaultLoginPageGeneratingFilter:生成一个默认的登录页面。BasicProcessingFilter:用于进行basic验证。SecurityContextHolderAwareRequestFilter:用来包装客户的请求,为后续程序提供一些额外的数据。例如,getRemoteUser()可获得当前登录的用户名。RememberMeProcessingFilter:实现RememberMe功能。AnonymousProcessingFilter:当用户没有登录时,分配匿名帐户的角色。ExceptionTranslationFilter:处理FilterSecurityInterceptor抛出的异常,然后将请求重定向到对应页面,或返回对应的响应错误代码。SessionFixationProtectionFilter:防御会话伪造攻击;解决办法是每次用户登录重新生成一个session。在http元素中添加session-fixation-protection="none"属性即可。FilterSecurityInterceptor:实现用户的权限控制。9.2.1利用SpringSecurity提供的登录页面1.web.xml配置文件【程序清单9-1】文件名为web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"> <!--Spring的ApplicationContext全局配置的载入--><context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/security-context.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
<!--servlet配置,具体配置文件servlet-context.xml同前--><servlet> <servlet-name>boke</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup></servlet> <servlet-mapping> <servlet-name>boke</servlet-name> <url-pattern>/</url-pattern></servlet-mapping>
<!--SpringSecurity3中的安全代理过滤器--><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> <welcome-file-list> <welcome-file>enter.jsp</welcome-file></welcome-file-list></web-app>2.配置文件(WEB-INF/security-context.xml)【程序清单9-2】文件名为security-context.xml<?xmlversion="1.0"encoding="UTF-8"?><beans><!--http安全配置--><httpauto-config="true"><intercept-urlpattern="/newlogin.jsp"access="IS_AUTHENTICATED_ANONYMOUSLY"/><intercept-urlpattern="/images/**"access="IS_AUTHENTICATED_ANONYMOUSLY"/><intercept-urlpattern="/css/**"access="IS_AUTHENTICATED_ANONYMOUSLY"/><intercept-urlpattern="/manager/**"access="ROLE_ADMIN"/><intercept-urlpattern="/teacher/**"access="ROLE_Teacher"/><intercept-urlpattern="/**"access="ROLE_Student"/></http><!--验证配置,认证管理器--><authentication-manager><authentication-provider><user-service><username="123"password="123"authorities="ROLE_Teacher,ROLE_ADMIN"/><username="abc"password="abc"authorities="ROLE_Student"/></user-service></authentication-provider></authentication-manager></beans:beans>4.登录完成后,获取用户登录名用户认证后,在MVC控制器的代码中,获取用户登录名的最简单方法有两种:(1)通过MVC方法参数注入的Principal对象的getName()方法。(2)通过MVC方法参数注入的HttpServletRequest对象的getRemoteUser()方法。9.2.2使用自制的登录页面1.security-context的修改对security-context.xml中HTTP的安全设置做如下修改:<http>
<form-loginlogin="/newlogin.jsp"
authentication-failure-url="/newlogin.jsp"default-target-url="/index.jsp"/>
<logoutlogout-success-url="/newlogin.jsp"/></http>在http元素中还可包含一些特殊的子元素。默认配置实际是支持匿名访问,匿名设置默认名称roleAnonymous,可以通过anonymous子元素定义匿名帐户名和角色名。例如,以下规定匿名帐户名为Guest。<anonymoususername="Guest"/><remember-me/>用来在一段时期内通过cookie记住登录用户,避免重复登录。但在登录表单中要加入<inputtype="checkbox"id="_spring_security_remember_me"/>复选框来选择是否记住用户,默认两周内可记住用户。<concurrent-session-control/>用来避免同一帐户并发登录。默认后登录的同名帐户将前面登录的用户踢出系统。2.自制的登录页面newlogin.jsp<formaction="j_spring_security_check"method="post"><DIVstyle="FILTER:dropshadow(color=#888888,offx=10,offy=10,positive=1);WIDTH:215px;HEIGHT:102px"><TABLEheight="96%"cellPadding=3width="97%"bgcolor="#F1FAFE"border=0style="border-collapse:collapse"><TR><TDalign=centerwidth="100%"colspan="2"bgcolor="#DDF0FF"><palign="center"><fontcolor="#0000FF">用户登录</font></TD></TR><TR><TDalign=rightwidth="40%">登录名</TD><TDalign=centerwidth="60%"><INPUTtype="text"size="12"name="j_username"></TD></TR><TR><TDalign=rightwidth="40%">口
令</TD><TDalign=centerwidth="60%"><INPUTtype="password"size="12"name="j_password"></TD></TR></TABLE></DIV><palign="center"><INPUTtype=submitname="log"value="登录"></p></form>9.3使用数据库用户进行认证数据库中含有两个表格,users表至少含有username,password,enabled三个字段;authorities表至少含有username、authority、id三个字段。其中,enabled为整数,1代表用户有效,0代表禁用,id采用自动编号。两个表通过username建立关联。一个用户有多个角色时,在authority表中要占多条记录。【程序清单9-4】文件名为security-context.xml
<beanid="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="sun.jdbc.odbc.JdbcOdbcDriver"/><propertyname="url"
value="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=f:/data.mdb"/></bean><beanid="userDetailsService"class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"><propertyname="dataSource"ref="dataSource"/></bean><sec:authentication-manager><sec:authentication-provideruser-service-ref="userDetailsService"/></sec:authentication-manager>以上配置中,首先定义了一个用Access数据库的数据源,SpringSecurity的JdbcDaoImpl类使用该数据源来加载用户信息。最后需要配置认证管理器使用该UserDetailsService。另一种办法是直接用如下标记指定JDBC数据源作为认证对象。<sec:authentication-manager><sec:authentication-provider><sec:jdbc-user-servicedata-source-ref="dataSource"/><sec:/authentication-provider><sec:/authentication-manager>9.4对用户密码进行加密处理
9.4.1SpringSecurity早期版本的PasswordEncoder在SpringSecurity3.1.0之前版本中,为加密和密码验证定义了PasswordEncoder接口。该接口安排在org.springframework.security.authentication.encoding包中。publicinterfacePasswordEncoder{StringencodePassword(StringrawPass,Objectsalt);booleanisPasswordValid(StringencPass,StringrawPass,Objectsalt);}
其中,encodePassword()方法是对原始密码进行加密,采用hash+salt方式,通过“盐值”(salt)避免字典攻击。加密后的密码是将原始用户密码和盐值合并后的内容进行加密后的结果。isPasswordValid方法是用来验证密码是否正确的,需要提供3个参数,加密后的密码,原始密码以及盐值。密码加密安全配置<authentication-manager><authentication-provider><password-encoderhash="sha"><salt-sourceuser-property="username"/>
</password-encoder><user-service><username="jimi"password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f"authorities="ROLE_USER,ROLE_ADMIN"/><username="bob"password="4e7421b1b8765d8f9406d87e7cc6aa784c4ab97f"authorities="ROLE_USER"/></user-service></authentication-provider>9.4.2SpringSecurity3.1.0后新增的PasswordEncoder在org.springframework.security.crypto包中。与前面的PasswordEncoder比较,好处是盐值不用用户提供,每次随机生成。随机盐确保相同的密码使用多次时,产生的哈希值不同,从而增加了密码破解难度。新接口定义如下:publicinterfacePasswordEncoder{Stringencode(StringrawPassword);booleanmatches(StringrawPassword,StringencodedPassword);}密码加密配置<beans:bean
class="org.springframework.security.crypto.password.StandardPasswordEncoder"
id="passwordEncoder"/><authentication-manager> <authentication-provider> <password-encoderref="passwordEncoder"/> <jdbc-user-servicedata-source-ref="dataSource"/></authentication-provider></authentication-manager>9.5关于访问授权表达式<httpuse-expressions="true"><intercept-urlpattern="/admin*"
access="hasRole('admin')andhasIpAddress('/24')"/>...</http>表达式描述hasRole(role)如果角色拥有指定的权限(role)则返回truehasAnyRole([role1,role2])如果角色拥有列表中任意一个权限则返回trueprincipal允许直接访问角色对象代表当前用户authentication允许直接访问Security上下文中的认证对象permitAll总是返回truedenyAll总是返回falseisAnonymous()如果角色是一个anonymous用户则返回trueisRememberMe()如果角色是一个remember-me用户则返回trueisAuthenticated()如果角色不是anonymous则返回trueisFullyAuthenticated()如果角色即不是anonymous,也不是remember-me用户则返回true表9-3授权访问的传统配置与表达式的等价传统配置表达式ROLE_ADMINhasRole('ROLE_ADMIN')ROLE_USER,ROLE_ADMINhasAnyRole('ROLE_USER,ROLE_ADMIN')ROLE_ADMIN,IS_AUTHENTICATED_FULLYhasRole('ROLE_ADMIN')andisFullyAuthenticated()IS_AUTHENTICATED_ANONYMOUSLYpermitAllIS_AUTHENTICATED_REMEMBEREDisAnonymous()orisRememberMe()IS_AUTHENTICATED_FULLYisFullyAuthenticated()9.6基于注解的方法访问的保护在安全配置文件中要加上如下行:<global-method-securitypre-post-annotations="enabled"/>1.使用@Secured和@PreAuthorize注解符@Secured("ROLE_USER")publicMyResourcegetRes(intid){
……}2.使用@PreFilterand@PostFilter过滤器
Spring安全支持一组过滤器,用来实现对集合和数组等对象的过滤。@PreFilter用来对方法调用时的参数进行过滤。@PostFilter用来对方法的返回结果进行过滤。
@PreAuthorize("hasRole('ROLE_USER')")
@PostFilter("hasPermission(filterObject,'read')orhasPermission(filterObject,'admin')")
publicList<Contact>getAll();9.7Spring提供的JSP安全标签库使用JSP标签库,首先要把spring-security-taglibs-3.1.0.RC2.jar放到项目的classpath下。在JSP页面上添加以下声明:
<%@taglibprefix="sec"uri="/security/tags"%>这个标签库包含3个标签,分别是authorize、authentication和accesscontrollist。要使用JSP安全标签,在配置文件将http标记的use-expressions属性设置为true:
<sec:httpuse-expressions="true">1.authorize标签<sec:authorizeaccess="hasRole('ROLE_MANAGER')">【说明】限定内容只有具有经理角色的用户才可见。<sec:authorizeurl="/manger/first">【说明】限定内容只有能访问“/manger/first”这个URL的用户才可见。以下代码限制只有用户拥有ROLE_ADMIN和ROLE_USER两个角色时,才能显示标签内部内容。<sec:authorizeifAllGranted="ROLE_ADMIN,ROLE_USER">
…….</sec:authorize>而将“ifAllGranted”改为“ifAnyGrante
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版高速铁路沿线基站场地租赁与资源共享合同3篇
- 盐化网络构建课程设计
- 移相器实验课程设计
- 2025版贷款担保合同管辖权调整书6篇
- 2025版智能租赁证办理及房屋管理系统合同3篇
- 2025年度智慧社区安防系统安装与维护服务合同2篇
- 程序与课程设计2
- 二零二五年仓储设施租赁与承包合同范本5篇
- 2025版车管所车辆抵押担保及登记合同3篇
- 石墨电极课程设计
- 伴瘤内分泌综合征
- 6SE70变频器使用手册
- 医学课件第十六章 肝胆胰疾病-胆道疾病
- 春节工地停工复工计划安排( 共10篇)
- 医院春节期间值班制度
- 商业模式画布模板-DOC格式
- 旭辉集团目标成本管理作业指引
- 国开电大2022年春季期末考试《物流管理定量分析方法》试题(试卷代号2320)
- 体外培育牛黄介绍呼吸科优秀
- 统编版人教版二年级语文下册二下语文日积月累及古诗
- 学院中层正副职民主测评表
评论
0/150
提交评论