首页 > 其他分享 >SpringSecurity的学习

SpringSecurity的学习

时间:2023-11-02 21:24:01浏览次数:37  
标签:authenticate boot SpringSecurity 学习 user org new starter

前置知识

1.RBAC关系模型  

 这个图片很清晰了,一个用户可以对应多个角色一个角色可以对应多个权限,这样子我们就可以引出我们所设计的数据库

用户,角色,权限共三张表,再通过两张表将他们连起来,这样子就可以进行权限控制,知道用户就可以得知该用户可以访问哪些模块,不能访问哪些模块。

SpringSecurity

这个就开始正题了

1.首先链接数据库等等的就省略了。

2.导入各种依赖。

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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>

<!-- mysql 的驱动和mybatisplus依赖-->

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>

<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--fastjson依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!--jwt依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>

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

3.创建各种实体类和mapper

4.开始编写过滤器,将登录请求允许

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {


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


@Resource
JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;

@Override
protected void configure(HttpSecurity http) throws Exception {
http
//关闭csrf
.csrf().disable()
//不通过Session获取SecurityContext
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
// 对于登录接口 允许匿名访问
.antMatchers("/user/login").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();


}

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}

5.编写UserDetails

这个接口的实现仅仅存储用户的信息,后续会将该接口提供的用户信息封装到认证的对象Authentication中去。所以我们这里是按照用户账号获得该用户的权限并封装给Authentication中。

    @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//判断用户表中是否有该用户
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getUserName,username);
User user = userMapper.selectOne(wrapper);
if(Objects.isNull(user)){
throw new RuntimeException("账号或密码错误");
}
// 获得该用户的所有权限
List<String> permissionKeyList = menuMapper.selectPermsByUserId(user.getId());

return new LoginUser(user,permissionKeyList);
}

6. 编写登录的service


@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private RedisCache redisCache;

@Override
public ResponseResult login(User user) {
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword());
Authentication authenticate = authenticationManager.authenticate(authenticationToken);

if(Objects.isNull(authenticate)){
throw new RuntimeException("账号密码错误");
}
//使用userid生成token
LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
String userId = loginUser.getUser().getId().toString();
String jwt = JwtUtil.createJWT(userId);
//authenticate存入redis
redisCache.setCacheObject("login:"+userId,loginUser);
//把token响应给前端
HashMap<String,String> map = new HashMap<>();
map.put("token",jwt);
return new ResponseResult(200,"登陆成功",map);
}

 

今日碰到的问题

1.有关Authentication authenticate = authenticationManager.authenticate(authenticationToken);堆栈溢出的报错,

UserDetailsService不是自己写的是SpringSecurity自带的,直接继承就行,我那时候不知道还自己写了个UserDetailsService,然后一直报错堆栈溢出,找了半天的错。

2.The signing key’s algorithm ‘AES’ does not equal a valid HmacSHA* algorithm name and cannot be used

 修改为HmacSHA256,修改完后大概率报错长度不够,我们只需要将以下的明文密钥修改的长一点就可以了。

 

标签:authenticate,boot,SpringSecurity,学习,user,org,new,starter
From: https://www.cnblogs.com/youseed/p/17806346.html

相关文章

  • 学习笔记8——20211303ltc
    学习笔记8一、作业要求自学教材第5章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第六周学习总结
    2023-2024-120231320《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第六周作业)这个作业的目标<自学《计算机基础与......
  • openGauss学习笔记-112 openGauss 数据库管理-管理用户及权限-行级访问控制
    openGauss学习笔记-112openGauss数据库管理-管理用户及权限-行级访问控制行级访问控制特性将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作,读取到的结果是不同的。用户可以在数据表创建行访问控制(RowLevelSecurity)策略,该......
  • [vue]精宏技术部试用期学习笔记 III
    精宏技术部试用期学习笔记(vue)父子通信什么是通信/为什么要通信通信即在不同组件之间传输数据当在复用组件时,需要传递不同数据达成不同的表现效果能够根据其他组件的行动,响应式的做出变化Props功能:让父组件信息传递到子组件code:假定index.vue已经通过rou......
  • JUC并发编程学习笔记(三)生产者和消费者问题
    生产者和消费者问题synchronized版->wait/notifyjuc版->Lock面试:单例模式、排序算法、生产者和消费者、死锁生产者和消费者问题Synchronized版packageorg.example.pc;publicclassA{publicstaticvoidmain(String[]args){Datedate=newDate();......
  • JUC并发编程学习笔记(二)Lock锁(重点)
    Lock锁(重点)传统的synchronized传统的解决多线程并发导致的一些问题我们会使用synchronized关键字来解决,synchronized的本质就是队列、锁。Lock的实现类有:可重复锁(最常用)、读锁、写锁在创建可重复锁时,可传入boolean类型值来决定该锁是公平锁(先来后到)还是非公平锁(可插队)......
  • Springmvc的学习
    导入jar包编写配置文件(点击Namespaces添加context、mvc)springmvc.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ......
  • JUC并发编程学习笔记(一)认知进程和线程
    进程和线程进程一个程序,如QQ.exe,是程序的集合一个进程往往可以包含多个线程,至少包含一个java默认有两个线程,GC垃圾回收线程和Main线程线程:一个进程中的各个功能java无法真正的开启线程,因为java是运行在虚拟机上的,所以只能通过C++,通过native本地方法调用C++开启线程priva......
  • C#学习之五大基础控件
    Label常见属性:Text:显示的文本内容。Font:设置字体属性。ForeColor:设置前景颜色。BackColor:设置背景颜色。AutoSize:控制是否自动调整大小。常见方法:Invalidate():使Label的整个显示区域无效。Refresh():强制控件立即重新绘制。TextBox常见属性:Text:设置或获......
  • 【学习笔记】决策单调性与四边形不等式
    Itst-决策单调性与四边形不等式学习笔记。这方面是真的一点不会啊。学点东西吧apj。约定对于\(n\timesm\)的矩阵\(A\),定义:子矩阵\(A_{[i_1,i_2,\cdots,i_k],[j_1,j_2,\cdots,j_l]}\)为矩阵\(A\)中第\(i_1,i_2,\cdots,i_k\)行和第\(j_1,j_2,\cdots......