SpringSecurity统一认证系统实现

本文详细介绍了如何使用Spring Security构建统一的认证与授权系统。从系统初始配置到自定义密码加密,再到认证逻辑设计,包括自定义登录界面、登录成功与失败处理器。接着,文章阐述了授权设计及实现,通过注解进行权限控制。此外,还讨论了异常处理,如AuthenticationException和AccessDeniedException,并提供了自定义异常处理对象的实现。最后,探讨了配置进阶设计,包括资源放行和默认登录登出设置。
摘要由CSDN通过智能技术生成

Spring Security统一认证系统实现

1 SpringSecurity 应用

1.1 简介

Spring Security是一个提供安全访问控制解决方案的安全框架

1.2 认证授权分析

在这里插入图片描述

1.3 项目实践

1.3.1 系统初始配置

pom文件

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>
</dependencies>

1.3.2 自定义密码加密

@Test
void encode(){
   
	//实例化Spring-Security提供的加密对象
	//按照BCrypt加密规则执行加密
	BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
	//将制定字符串(密码)加密为密文字符串的方法如下
	String pwd=encoder.encode("aaa");
	System.out.println(pwd);
	//随机加盐保证每次加密的结果都不同
}
@Test
void match(){
   
	BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
	//验证字符串是否匹配加密结果
	//参数1:明文密码  参数2:加密后的密码
	boolean b=encoder.matches("pwd",
	"$2a$10$f8J5ggyndSwp6IFRIEkPtucAlpUpaXFlO4stHt6OudTcM152UQsKW");
	System.out.println(b);
}

在application.properties设置加密后的结果,声明算法ID

# Spring-Security设置用户名密码
spring.security.user.name=admin

# Spring-Security设置密码
# 算法ID{
   bcrypt}后面跟加密的密码
spring.security.user.password={
   bcrypt}$2a$10$f8J5ggyndSwp6IFRIEkPtucAlpUpaXFlO4stHt6OudTcM152UQsKW

1.4 认证逻辑与设计

1.4.1 自定义登录逻辑

SpringSecurity通过UaerDetailsService接口提供用户登录的授权信息

第一步:定义Security的配置类

@Configuration
public class SecutiryConfig {
   
    @Bean
    public PasswordEncoder passwordEncoder(){
   
        return new BCryptPasswordEncoder();
    }
}

第二步:定义UserDetailService接口实现类,自定义登陆逻辑

@Service
public class UserDetailServiceImpl implements UserDetailsService {
   

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 
	{
   
        if(!"admin".equals(username))
        throw new UsernameNotFoundException("user not found");
        //从Cookie中查询出来的加密密码
        String password=passwordEncoder.encode("pwd");
        //从Cookie查询出来的用户信息,第三个参数为用户权限
        return new User(username,password, 
						AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_admin,ROLE_normal,/doRetrieve,/doCreate"));
    }
}

1.4.2 自定义登录界面

第一步:定义登录界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值