- 1.Spring Security 概述
- 2.基本入门
- 3.自定义用户名和密码
- 3.1 配置文件
- 3.2 配置类
- 3.3 自定义用户名和密码
- 4.应用场景
- 5.两个很重要的接口
- 5.1 UserDetailsService
- 5.2 PasswordEncoder接口
Spring Security是一个高度自定义的安全框架。利用Spring IoC/DI和AOP功能,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作。
正如你可能知道的关于安全方面的两个主要区域是“认证
”和“授权
”(或者访问控制)。这两点也是Spring Security重要核心功能。“认证”,是建立一个他声明的主体的过程(一个“主体”一般是指用户,设备或一些可以在你的应用程序中执行动作的其他系统),通俗点说就是系统认为用户是否能登录。“授权”指确定一个主体是否允许在你的应用程序执行一个动作的过程。通俗点讲就是系统判断用户是否有权限去做某些事情。
整合SpringBoot
pom:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
自动装配就将过滤器链装配进容器了。
定义一个控制器:
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
访问路径 localhost:8080/test/hello
用户名为 user, 密码为 9df0a5b8-9f67-4c42-8b78-ea7a7968afcc
- 1.配置文件
- 2.配置类
- 3.自定义类定义用户名和密码
这里的配置类中定义了一种加密方式, 和通过继承WebSecurityConfigurerAdapter 类, 实现了configure方法取定义用户名和密码。
@Configuration
public class Config01 extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("root01")
.password(new BCryptPasswordEncoder().encode("root01"))
.roles("admin");
}
}
自定义一个service 实现 UserDetailService
用户名:root02 密码:root02
@Service
public class MyUserDetailService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
List list = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
return new User("root02", new BCryptPasswordEncoder().encode("root02"), list);
}
}
定义的配置了去引用这个service
@Configuration
public class Config02 extends WebSecurityConfigurerAdapter {
@Resource
private MyUserDetailService myUserDetailService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
最后的这种方法以后通过访问数据库来授权。
- 对已有项目添加认证功能
- 需要有权限控制的项目都可以使用Spring Security。
上面通过两个接口实现了自定义用户名和密码
5.1 UserDetailsService返回值UserDetails, 为一个接口
它的实现类为User。
在User类中提供了很多方法和属性。
其中构造方法有两个,调用其中任何一个都可以实例化UserDetails实现类User类的实例。而三个参数的构造方法实际上也是调用7个参数的构造方法。
- username:用户名
- password:密码
- authorities:用户具有的权限。此处不允许为null
此处的用户名应该是客户端传递过来的用户名。而密码应该是从数据库中查询出来的密码。Spring Security会根据User中的password和客户端传递过来的password进行比较。如果相同则表示认证通过,如果不相同表示认证失败。
authorities里面的权限对于后面学习授权是很有必要的,包含的所有内容为此用户具有的权限,如有里面没有包含某个权限,而在做某个事情时必须包含某个权限则会出现403。通常都是通过AuthorityUtils.commaSeparatedStringToAuthorityList(“”)来创建authorities集合对象的。参数时一个字符串,多个权限使用逗号分隔。
方法参数
方法参数表示用户名。此值是客户端表单传递过来的数据。默认情况下必须叫username,否则无法接收。
异常
UsernameNotFoundException 用户名没有发现异常。在loadUserByUsername中是需要通过自己的逻辑从数据库中取值的。如果通过用户名没有查询到对应的数据,应该抛出UsernameNotFoundException,系统就知道用户名没有查询到。
- encode: 把参数按照特定的解析规则进行解析。
- mathes: 验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。
- upgradeEncoding: 如果解析的密码能够再次进行解析且达到更安全的结果则返回true,否则返回false。默认返回false。
实现类:
BCryptPasswordEncoder为官方推荐的解析器, 是对bcrypt强散列方法的具体实现。是基于Hash算法实现的单向加密。可以通过strength控制加密强度,默认10.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)