欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Spring Security

Spring Security

2024/10/24 15:23:55 来源:https://blog.csdn.net/yanshengren520/article/details/140702060  浏览:    关键词:Spring Security

Spring Security

它是Spring家族中的一个安全管理框架,具备功能有:身份认证、授权、防御常见攻击(CSRF、HTTP Headers、HTTP Requests),它的底层原理是传统的Servlet过滤器

官方文档:

https://docs.spring.io/spring-security/reference/index.html

spring-security官方案例:

https://github.com/spring-projects/spring-security-samples/tree/main)

自定义配置

基于内存的用户认证

UserDetailsService用来管理用户信息

@Configuration
@EnableWebSecurity //Spring项目总需要添加此注解
public class WebSecurityConfig {@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser( User.withDefaultPasswordEncoder().username("yan")     //自定义用户名.password("123456")  //自定义密码.roles("USER")       //自定义角色.build());return manager;}
}

再次登录页面,必须输入所设置的用户名和密码,才可以登录成功,否则失败,不再使用Security默认的用户名和密码。

基于数据库的数据源

基础sql脚本

-- 创建数据库
CREATE DATABASE `security-demo`;
USE `security-demo`;-- 创建用户表
CREATE TABLE `user`(`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',`username` VARCHAR(50) DEFAULT NULL COMMENT '用户名',`password` VARCHAR(500) DEFAULT NULL COMMENT '密码',`enabled` BOOLEAN NOT NULL COMMENT '是否启动'
);
-- 唯一索引
CREATE UNIQUE INDEX `user_username_uindex` ON `user`(`username`); -- 插入用户(密码是 "abc" )
INSERT INTO `user` (`username`, `password`, `enabled`) VALUES
('admin', '{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', TRUE),
('Helen', '{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', TRUE),
('Tom', '{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW', TRUE);

完成基础的增删改查…

@Configuration
public class DBUserDetailsManager implements UserDetailsManager, UserDetailsPasswordService {@Resourceprivate UserMapper userMapper;  // 数据库 - 用户表mapper@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// sql - 查询用户表 (根据用户名,进行查询用户表)User user = userMapper.selectOne(username);if (user == null) {throw new UsernameNotFoundException(username);} else {Collection<GrantedAuthority> authorities = new ArrayList<>();return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),user.getEnabled(),true,        // 用户账号是否过期true,        // 用户凭证是否过期true,        // 用户是否未被锁定authorities);// 权限列表}}@Overridepublic UserDetails updatePassword(UserDetails user, String newPassword) {return null;}// 创建用户@Overridepublic void createUser(UserDetails userDetails) {User user = new User();user.setUsername(userDetails.getUsername());user.setPassword(userDetails.getPassword());user.setEnabled(true);userMapper.insert(user);}@Overridepublic void updateUser(UserDetails user) {}@Overridepublic void deleteUser(String username) {}@Overridepublic void changePassword(String oldPassword, String newPassword) {}@Overridepublic boolean userExists(String username) {return false;}}

加密算法

Hash算法:

Spring Security的PasswordEncoder接口用于对密码进行单向转换,使用哈希算法,例如MD5、SHA-256、SHA-512等,哈希算法是单向的,只能加密,不能解密。缺点:通过破解的方式猜测密码。

彩虹表:

恶意用户创建称为彩虹表的查找表,越是复杂的密码,需要的彩虹表就越大。

加盐密码:

盐是随机生产的字节(是明文的),盐和用户的密码一起经过哈希函数运算,生产一个哈希值,再与库的密码进行比较,可避免彩虹表,每个盐和密码它的哈希值都是不同的。

自适应单向函数:

随着硬件的不断发展,加盐哈希也不再安全。因为计算机可以每秒执行亿级别哈希运行,所有自适应单向函数,产生一个工作因子,来故意占用CPU、内存,让攻击者很难破解。

PasswordEncoder

  • BCryptPasswordEncoder:使用广泛支持的bcrypt算法来对密码进行哈希。为了增加对密码破解的抵抗力,bcrypt故意设计得较慢。和其他自适应单向函数一样,应该调整其参数,使其在您的系统上验证一个密码大约需要1秒的时间。
  • Argon2PasswordEncoder:使用Argon2算法对密码进行哈希处理。Argon2是密码哈希比赛的获胜者。
  • Pbkdf2PasswordEncoder:使用PBKDF2算法对密码进行哈希处理。为了防止密码破解,PBKDF2是一种故意缓慢的算法。
  • SCryptPasswordEncoder:使用scrypt算法对密码进行哈希处理。为了防止在自定义硬件上进行密码破解,scrypt是一种故意缓慢的算法

自定义登录页

创建对应的html的登录页,在Security自定义配置类里,添加:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeRequests(a -> {a.anyRequest()      // 对所有请求开启授权保护.authenticated();  // 已认证的请求会自动授权}).formLogin(f -> {f.loginPage("/login").permitAll() // 登录页面无需授权即可访问.usernameParameter("username")   // 自定义表单用户名参数,默认是username.passwordParameter("password")   // 自定义表单密码参数,默认是password.failureUrl("/login?error");     //登录失败的返回地址}); // 表单授权方式http.csrf(csrf -> csrf.disable());  // 暂时关闭csrf攻击return http.build();
}

前后端分离

用户认证

  • 登录成功后调用:AuthenticationSuccessHandler
  • 登录失败后调用:AuthenticationFailureHandler

需要重写这2个过滤器,然后在Security自定义配置类进行对应的配置。

注销处理

  • 注销处理调用:LogoutSuccessHandler

需要重写这个过滤器,然后在Security自定义配置类进行对应的配置。

请求未认证的接口

当访问没有授权认证的接口,默认的Spring Security会使用AuthenticationEntryPoint将用户请求跳转到登录页面,要求用户提供登录凭证,如果自定义的,可以设置返回的信息进行处理。

  • 未认证处理调用:AuthenticationEntryPoint

需要重写这个过滤器,然后在Security自定义配置类进行对应的配置。

跨域

# 在Security自定义配置类 这里添加
http.cors(withDefaults());

身份认证

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com