今天我们就来学习spring security 的配置文件applicationContext-security.xml文件
----------------------3小时完成-----------------------------------
要做的事:学会在web.xml文件中配置,学会applicationContext-security.xml文件配置
1、掌握配置文件运行原理。
2、学会在web.xml文件中配置spring security文件。
3、学会applicationContext-security.xml文件中的配置标签。
-------------------------------------------------------------------------
第一步,掌握配置文件运行原理。要知道配置文件是干什么用的,什么时候被用到。在java框架中的配置文件,是初始化数据使用的。是在程序一开始就被用到。配置文件web.xml是被tomcat容器加载的,而tomcat就相当于一个代理类。applicationContext-security.xml是通过web.xml作为入口初始化spring security的入口的。
第二步,学会在web.xml文件中配置spring security文件。这个配置文件就是applicationContext-security.xml。
首先,在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>
注意filter-name一定要写成springSecurityFilterChain。在DelegatingFilterProxy类init时,会获取filter-name,然后通过filter-name去spring中获取代理的bean。DelegatingFilterProxy是代理授权过滤器。而spring-security的配置是由HttpSecurityBeanDefinitionParser解析器解析,每一个http都会被解析成一个SecurityFilterChain都添加到FilterChainProxy中的filterChains中。而且该FilterChainProxy会以springSecurityFilterChain注册得到spring的bean中。
<http realm="Contacts Realm">
<intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/index.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/hello.htm" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/switchuser.jsp" access="ROLE_SUPERVISOR"/>
<intercept-url pattern="/j_spring_security_switch_user" access="ROLE_SUPERVISOR"/>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/>
<http-basic/>
<logout logout-success-url="/index.jsp"/>
<remember-me />
<custom-filter ref="switchUserProcessingFilter" position="SWITCH_USER_FILTER"/>
</http>
说明:
access后接用户角色,IS_AUTHENTICATED_ANONYMOUSLY代表匿名登录,ROLE_USER代表普通用户,ROLE_SUPERVISOR代表超级管理员。
程序在启动的时候会遍历解析spring-security配置文件,当命名空间是<http>
的时候就使用HttpSecurityBeanDefinitionParser类来解析。
<!-- 静态资源,不用权限 -->
<httppattern="/resources/**"security="none"/>
<httppattern="/verify/**"security="none"/>
<httppattern="/user/login.htm"security="none"/>
<httppattern="/user/register.*"security="none"/>
<httppattern="/favicon.ico"security="none"/>
当发现security="none"
的时候,则创建一个DefaultFilterChain添加到FilterChainProxy的filterChains属性中。
----------------------------------------------------------------------------------------------------------------------------
最小<http>配置
只需要进行如下配置就可以配置成一个安全配置
<http auto-config='true'>
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
这表示,我们要保护应用程序中的所有URL,只有拥有ROLE_USER角色的用户才能访问。
<http auto-config='true'>这一句其实是一些配置的缩写:
<http>
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login />
<anonymous />
<http-basic />
<logout />
<remember-me />
</http>
这些元素分别与form-login,匿名认证,注销处理和remember-me对应。
auto-config需要一个UserDetailsService
使用auto-config的时候如果没有配置UserDetailsService就会出现错误。这是因为remember-me服务在auto-config="true"的时候启动了,它的认证机制需要UserDetailsService来实现。
如果碰到报没有定义UserDetailsService造成的问题,试着去掉auto-config配置。
下边这些是标签属性说明:
配置说明:
lowercase-comparisons:表示URL比较前先转为小写。
path-type:表示使用Apache Ant的匹配模式。
access-denied-page:访问拒绝时转向的页面。
access-decision-manager-ref:指定了自定义的访问策略管理器。当系统角色名的前缀不是默认的ROLE_时,需要自定义访问策略管理器。
login-page:指定登录页面。
login-processing-url:指定了客户在登录页面中按下 Sign In 按钮时要访问的 URL。与登录页面form的action一致。其默认值为:/j_spring_security_check。
authentication-failure-url:指定了身份验证失败时跳转到的页面。
default-target-url:指定了成功进行身份验证和授权后默认呈现给用户的页面。
always-use-default-target:指定了是否在身份验证通过后总是跳转到default-target-url属性指定的URL。
logout-url:指定了用于响应退出系统请求的URL。其默认值为:/j_spring_security_logout。
logout-success-url:退出系统后转向的URL。
invalidate-session:指定在退出系统时是否要销毁Session。
max-sessions:允许用户帐号登录的次数。范例限制用户只能登录一次。
exception-if-maximum-exceeded: 默认为false,此值表示:用户第二次登录时,前一次的登录信息都被清空。
当exception-if-maximum-exceeded="true"时系统会拒绝第二次登录。