3.Spring Security快速上手(使用SpringMVC架构)
3.1Spring Security介绍
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员,因此它伴随着整个Spring生态系统的不断修正、升级,在SpringBoot项目中加入Spring Security更是十分简单,使用Spring Security减少了为企业系统安全控制编写大量重复代码的工作。
3.2创建Maven工程
引入SpringMVC的依赖包,还有Spring Security的依赖:
<!-- Security依赖 start -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.3.2.RELEASE</version>
</dependency>
<!-- Security依赖 end -->
因为Servlet3.0支持使用Java类配置MVC,所以就不使用xml文件方式。
建一个ApplicationConfig类,此类替代applicationContext.xml配置文件,具体代码如下:
@Configuration//相当于applicationContext.xml
@ComponentScan(basePackages = "com.hwj.securitytest",
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class)})
public class ApplicationConfig {
//在此配置除了Controller的其他bean,比如:数据库连接池、事务管理器、业务bean等。
}
建一个WebMVCConfig类,此类替代springMVC.xml文件,具体代码如下:
@Configuration//相当于springMvc.xml文件
@EnableWebMvc
@ComponentScan(basePackages = "com.hwj.securitytest",
includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class)})
public class WebMvcConfig implements WebMvcConfigurer {
//视图解析器
@Bean
public InternalResourceViewResolver internalResourceViewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("/WEB-INF/view/");
internalResourceViewResolver.setSuffix(".jsp");
return internalResourceViewResolver;
}
//视图映射器
}
建一个初始化Spring容器的类:
public class SpringApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{ApplicationConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
到此,Spring Security 在SpringMVC中的环境已经搭建完成。
3.3认证
3.3.1认证页面
Spring Security 默认提供认证页面,不需要额外开发。
3.3.2安全配置
Spring Security提供了用户名和密码登录、退出、会话管理认证功能,只需要配置即可使用。
1)定义一个配置Security的类(类名随便取),继承WebSecurityConfigurerAdapter类,并在类上加注解@EnableWebSecurity。安全配置的内容包括:用户信息、密码编辑器、安全拦截机制。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//定义用户信息服务(查询用户信息)
@Bean
public UserDetailsService userDetailsService(){
//基于内存查
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("zhangsan").password("123456").authorities("p1").build());
manager.createUser(User.withUsername("lisi").password("12345678").authorities("p2").build());
return manager;
}
//密码编码器(有多种)
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
//安全拦截机制
@Override
protected void configure(HttpSecurity http) throws Exception {
//表示所有/r/**请求必须认证通过
http.authorizeRequests().antMatchers("/r/**").authenticated()
.anyRequest().permitAll()//除了/r/**,其他请求可以访问
.and().formLogin()//允许表单登录
.successForwardUrl("/loginSuccess");//自定义登陆成功的页面地址
}
}
定义一个初始化Security的类:
public class SpringSecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
public SpringSecurityApplicationInitializer(){
}
}
在WebConfig类中添加视图映射器:
//视图映射器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("redirect:/login");//表示重定向到Security提供的登陆页面,自己无需新建login页
}
效果:
3.4授权
只允许有p1权限的用户访问资源r1,只允许有p2权限的人访问资源r2:
则Security配置类中安全拦截机制的代码为:
//安全拦截机制
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/r/r1").hasAuthority("p1")
.antMatchers("/r/r2").hasAuthority("p2")
.antMatchers("/r/**").authenticated()//表示所有/r/**请求必须认证通过
.anyRequest().permitAll()//除了/r/**,其他请求可以访问
.and().formLogin()//允许表单登录
.successForwardUrl("/loginSuccess");//自定义登陆成功的页面地址
}
lisi只有p2权限,当lisi去访问r1时:
403状态码表示未授权。