Java学习笔记-SpringSecurity入门-搬运文章(单体项目)
SpringSecurity-入门版
1. SpringSecurity概述
1.1. SpringSecurity介绍
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
2. SpringSecurity入门
2.1.入门案例-认证
l 搭建工程
基于SpringBoot搭建web工程 ,项目名为“spring-security-demo”
l 导入依赖
这里继承了SpringBoot的父工程,引入SpringSecurity基础依赖
“spring-boot-starter-security”,以及集成web的依赖“spring-boot-starter-web”
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> |
l 主配置类
@SpringBootApplication public class ApplicationConfig { public static void main(String[] args) { SpringApplication.run(ApplicationConfig.class); } } |
l Web控制器
当用户认证成功之后会重定向到该方法,返回“登录成功”给用户
@Controller public class AuthController { //登录成功后重定向地址 @RequestMapping("/loginSuccess") @ResponseBody public String loginSuccess(){ return "登录成功"; } } |
l 配置SpringSecurity
SpringSecurity提供了一个配置类WebSecurityConfigurerAdapter用来提供给程序员对SpringSecurity做自定义配置,我们需要配置如下几个信息:
² 创建UserDetailService的Bean,该组件是用来加载用户认证信息
² 配置编码器,通过该编码器对密码进行加密匹配。
² 授权规则配置,哪些资源需要什么权限..
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
//提供用户信息,这里没有从数据库查询用户信息,在内存中模拟 @Bean public UserDetailsService userDetailsService(){ InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager(); inMemoryUserDetailsManager.createUser(User.withUsername("zs").password("123").authorities("admin").build()); return inMemoryUserDetailsManager; }
//密码编码器:不加密 @Bean public PasswordEncoder passwordEncoder(){ return NoOpPasswordEncoder.getInstance(); }
//授权规则配置 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() //授权配置 .antMatchers("/login").permitAll() //登录路径放行 .anyRequest().authenticated() //其他路径都要认证之后才能访问 .and().formLogin() //允许表单登录 .successForwardUrl("/loginSuccess") // 设置登陆成功页 .and().logout().permitAll() //登出路径放行 .and().csrf().disable(); //关闭跨域伪造检查 } } |
2.2.认证流程小结
SpringBoot+SpringSecurity集成入门案例到这里就结束了,这里并没有多SpringSecurity原理做过多解释(留在后面章节),那么这个案例大概的实现思路是:
- SpringSecurity根据我们在WebSecurityConfig中的配置会对除了“/login”之外的资源进行拦截做认证检查,
- 如果没有认证会跳转到默认的认证页面“/login” ,
- 输入用户名和密码后点击登录,SpringSecurity会带着用户名调用 UserDetailsService.loadUserByUsername获取用户的认证信息(用户名,密码,权限等),
- 然后执行认证工作:表单密码和loadUserByUsername加载的数据库的密码进行匹配(PasswordEncoder)
- 认证成功跳转成功地址