- 简介:spring security是spring家族的成员。spring security基于spring框架,提供了一套Web应用安全性的完整解决方案。
- 核心功能:用户认证(Authentication)和用户授权(Authorization)
- 用户认证指:验证某个用户是否是系统中的合法主体;通过验证用户名和密码完成认证过程。
- 用户授权:验证某个用户是否有权限执行某个操作。
- 权限管理中的相关概念
- 主体:principal 谁使用系统,谁就是主体
- 认证:authentication 权限管理系统确认一个主体的身份,允许主体进入系统
- 授权:authorization 将操作系统的权利授予主体
spring security的本质就是一条过滤器链。
spring security 的使用
- 首先需要创建一个专门的spring-security配置文件 首先,我们需要定义一个http元素用来定义Web相关权限控制,security只是我们使用命名空间的一个前缀。
<security:http auto-config="true">
<security:intercept-url pattern="/**" access="ROLE_USER"/>
</security:http>
其中,intercept-url定义了一个权限控制的规则。pattern属性表示我们将对哪些url进行权限控制,也可以是一个正则表达式;access属性表示在请求对应的url时需要什么权限,默认配置时是一个角色列表用,分割。 其次,需要定义一个AuthenticationManager用于认证。
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="user" password="user" authorities="ROLE_USER"/> <security:user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
authentication-manager元素指定了一个AuthenticationManager,需要一个authentication-provider来进行真正的认证,默认情况下需要user-service元素来获得用户信息对应user元素。但是实际上真实使用时,用户信息都是从数据库中获取的。
- 我们需要在web.xml中通过context-param将spring-security配置文件指定为spring的初始配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/applicationContext.xml,/WEB-INF/config/spring-security.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
我们还需要一个代理过滤器,用于拦截所有交给spring security处理的请求,需要注意的是这个过滤器一定要定义在其他如spring mvc 等拦截请求之前。并且这个过滤器的名字springSecurityFilterChain不能变
<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>
关于登录
form-login元素介绍:是用来定义表单登录信息的。
使用自定义登录页面
自定义登录属性是通过login-page属性指定的。
- username-parameter:表示登录时用户名使用的是哪个参数
- password-parameter:表示登录时密码使用的是哪个参数
- login-processing-url:表示登录时提交的地址
<security:http auto-config="true">
<security:form-login login-page="/login.jsp" login-processing-url="/login.do" username-parameter="username" password-parameter="password" />
<!-- 表示匿名用户可以访问 -->
<security:intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
指定登录后的页面
通过form-login元素的default-target-url指定
认证过程
- 用户使用用户名和密码进行登录。
- Spring Security 将获取到的用户名和密码封装成一个实现了 Authentication 接口的 UsernamePasswordAuthenticationToken。
- 将上述产生的 token 对象传递给 AuthenticationManager 进行登录认证。
- AuthenticationManager 认证成功后将会返回一个封装了用户权限等信息的 Authentication 对象。
- 通过调用 SecurityContextHolder.getContext().setAuthentication(...) 将 AuthenticationManager 返回的 Authentication 对象赋予给当前的 SecurityContext。 Spring Security AuthenticationProvider
认证是由AuthenticationManager管理的,但是真正进行认证的是AuthenticationManager里面的AuthenticationProvider。在进行认证的时候需要一个UserDetailsService来获取用户信息UserDetails。
<security:authentication-manager>
<security:authentication-provider user-service-ref="myUserDetailsService"/>
</security:authentication-manager>
需要创建自己的UserService类实现UserDetailsService接口