1.springSecurity简介
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作
a:认证:其实就是从数据库中是否可以查到该信息
b:授权:有没有权限登录或者执行某个操作
2.基础入门
2.1.导入spring-security依赖
<!--spring-security开始-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
<!--spring-security结束-->
2.2 配置spring-security
2.2.1 基于xml配置
spring-security.xml
!-- 不拦截的资源文件,-静态资源放行,登陆页面,favicon.ico图标等->
<security:http pattern="favicon.ico" security="none"/>
<security:http pattern="/login.jsp" security="none"/>
<security:http pattern="/css/**" security="none"/>
<!--
配置拦截的规则
auto-config="使用自带的页面"
use-expressions="是否使用spel表达式",如果使用表达式:hasRole('ROLE_USER')
<security:http auto-config="true" use-expressions="true">
<!-- 配置拦截的请求地址,任何请求地址都必须有ROLE_USER的权限 -->
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
</security:http>
-->
<security:http auto-config="true" use-expressions="false">
<!-- 配置拦截的请求地址,任何请求地址都必须有ROLE_USER(与下文的认证管理器中的相对应)的权限 -->
<security:intercept-url pattern="/**" access="ROLE_USER"/>
<!-- 配置具体的页面跳转 -->
<!--
login-page="/login.jsp" 登陆页面
default-target-url="/success.jsp" //登陆成功之后去的页面
authentication-failure-url="/error.jsp" //登陆失败之后去的页面
login-processing-url="/login" //访问登陆页面的路径
-->
<security:form-login login-page="/login.jsp"
default-target-url="/index.jsp"
authentication-failure-url="/failer.jsp"
login-processing-url="/login"/>
<!-- 关闭跨站请求伪造(Cross-site request forgery) -->
<security:csrf disabled="true"></security:csrf>
<!-- 退出 -->
<security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp"/>
</security:http>
<!-- 配置认证信息,认证管理器 -->
<!-- 在内存中临时提供用户名和密码的数据 -->
<security:authentication-manager>
<!--认证信息的提供者-关联用户服务对象,提供账号和密码-->
<security:authentication-provider >
如果使用实时数据,那么以下的内容就不需要了,只需要关联yoghurt服务对象,提供账号及密码就好,这句话{{{user-service-ref="userServiceImpl"}}}添加到认证信息标签内即可
<!--用户的服务对象-->
<!--<security:user-service>-->
<!--
用户信息,是临时的账号和密码
{noop}不使用加密
authorities:指定用户的认证角色
-->
<!--<security:user name="admin" password="{noop}admin" authorities="ROLE_USER"/>-->
<!--</security:user-service>-->
</security:authentication-provider>
</security:authentication-manager>
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml</param-value>
</context-param>
<!--配置委派代理过滤器: filter-name必须是: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>
2.2.2 基于注解配置
a:第一步是要创建Spring Security的Java 配置类
b:创建类SecurityConfiguration继承WebSecurityConfigurerAdapter,来对我们应用中所有的安全相关的事项(所有url,验证用户名密码,表单重定向等)进行控制。
SecurityConfiguration.java
package com.itheima.controller;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* <li>security config</li>
*/
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
/**
* 配置user-detail服务
* @param auth
* @throws Exception
*/
@Override
public void configure(AuthenticationManagerBuilder auth)throws Exception{
}
/**
* 拦截请求
* @param http
* @throws Exception
*/
@Override
public void configure(HttpSecurity http)throws Exception{
}
/**
* 拦截请求
* @param web
* @throws Exception
*/
@Override
public void configure(WebSecurity web) throws Exception {
}
}
WebSecurityConfigurerAdapter共有三个configure方法。
public void configure(WebSecurity web) 通过重载,配置Spring Security的Filter链
public void configure(HttpSecurity http) 通过重载,配置如何通过拦截器保护请求
public void configure(AuthenticationManagerBuilder auth) 通过重载,配置user-detail服务
@EnableWebSecurity 注解将会启用Web安全功能。
c:初始化springSecurityFilter注册类,这里使用的方法是继承类AbstractSecurityWebApplicationInitializer
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
/**
* <li>注册springSecurityFilter</li>
*/
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer
{ }
下篇文章讲述springsecurity用户存储认证方式