Spring Security 笔记

179 阅读3分钟
  1. 简介:spring security是spring家族的成员。spring security基于spring框架,提供了一套Web应用安全性的完整解决方案。
  2. 核心功能:用户认证(Authentication)和用户授权(Authorization)
    1. 用户认证指:验证某个用户是否是系统中的合法主体;通过验证用户名和密码完成认证过程。
    2. 用户授权:验证某个用户是否有权限执行某个操作。
  3. 权限管理中的相关概念
  • 主体:principal 谁使用系统,谁就是主体
  • 认证:authentication 权限管理系统确认一个主体的身份,允许主体进入系统
  • 授权:authorization 将操作系统的权利授予主体

spring security的本质就是一条过滤器链。

spring security 的使用

  1. 首先需要创建一个专门的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元素。但是实际上真实使用时,用户信息都是从数据库中获取的。

  1. 我们需要在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指定

认证过程

  1. 用户使用用户名和密码进行登录。
  2. Spring Security 将获取到的用户名和密码封装成一个实现了 Authentication 接口的 UsernamePasswordAuthenticationToken。
  3. 将上述产生的 token 对象传递给 AuthenticationManager 进行登录认证。
  4. AuthenticationManager 认证成功后将会返回一个封装了用户权限等信息的 Authentication 对象。
  5. 通过调用 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接口