当前位置:网站首页>10-security登录
10-security登录
2022-08-03 00:34:00 【张 邵】
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
user实体
package com.zs.model.common.pojos;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value ="sys_user")
public class User implements Serializable {
/** * 主键 */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** * 用户名 */
@TableField(value = "user_name")
private String userName;
/** * 昵称 */
@TableField(value = "nick_name")
private String nickName;
/** * 密码 */
@TableField(value = "password")
private String password;
/** * 账号状态(0正常 1停用) */
@TableField(value = "status")
private String status;
/** * 邮箱 */
@TableField(value = "email")
private String email;
/** * 手机号 */
@TableField(value = "phonenumber")
private String phonenumber;
/** * 用户性别(0男 1女 2未知) */
@TableField(value = "sex")
private String sex;
/** * 头像 */
@TableField(value = "avatar")
private String avatar;
/** * 用户类型(0 管理员, 1 普通用户) */
@TableField(value = "user_type")
private String userType;
/** * 创建人的用户id */
@TableField(value = "create_by")
private Long createBy;
/** * 创建时间 */
@TableField(value = "create_time")
private Date createTime;
/** * 更新人 */
@TableField(value = "update_by")
private Long updateBy;
/** * 更新时间 */
@TableField(value = "update_time")
private Date updateTime;
/** * 删除标志(0 未删除,1 已删除) */
@TableField(value = "del_flag")
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
自定义UserDetails实现类
package com.zs.admin.security.service;
import com.alibaba.fastjson.annotation.JSONField;
import com.zs.model.common.pojos.User;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Data
//@AllArgsConstructor
@NoArgsConstructor
public class LoginUser implements UserDetails {
private String password;
private String username;
//存储SpringSecurity所需要的权限信息的集合
@JSONField(serialize = false)
private Set<GrantedAuthority> authorities;
private boolean accountNonExpired = true;
private boolean accountNonLocked = true;
private boolean credentialsNonExpired = true;
private boolean enabled = true;
private User user;
//存储权限信息
private List<String> permissions;
public LoginUser(User user, List<String> permissions) {
this.user = user;
this.permissions = permissions;
}
@Override // 表示获取登录用户所有权限
public Collection<? extends GrantedAuthority> getAuthorities() {
if(authorities!=null){
return authorities;
}
//把permissions中字符串类型的权限信息转换成GrantedAuthority对象存入authorities中
authorities = permissions.stream().
map(SimpleGrantedAuthority::new)
.collect(Collectors.toSet());
return authorities;
}
@Override // 表示获取密码
public String getPassword() {
return user.getPassword();
}
@Override // 表示获取用户名
public String getUsername() {
return user.getUserName();
}
@Override // 表示判断账户是否过期
public boolean isAccountNonExpired() {
return true;
}
@Override // 表示判断账户是否被锁定
public boolean isAccountNonLocked() {
return true;
}
@Override // 表示凭证{密码}是否过期
public boolean isCredentialsNonExpired() {
return true;
}
@Override // 表示当前用户是否可用
public boolean isEnabled() {
return true;
}
}
自定义UserDetailsService实现类
package com.zs.admin.security.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zs.model.common.mapper.UserMapper;
import com.zs.model.common.pojos.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
UserMapper userMapper;
// @Autowired
// MenuMapper menuMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//查询用户信息
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getUserName,username);
User user = userMapper.selectOne(lambdaQueryWrapper);
//如果没有查询到就抛出异常
if (Objects.isNull(user)){
throw new RuntimeException("用户名或密码错误 !");
}
//TODO 根据用户查询权限信息 添加到LoginUser中
List<String> list = new ArrayList<>(Arrays.asList("test"));
// List<String> list = menuMapper.selectPermsByUserId(user.getId()); //[system:test:list]
//
return new LoginUser(user,list);
}
}
添加编码器
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//密码编码解码器
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
使用自定义登录接口
@RestController("adLoginController2")//相当于 @Controller + @ResponseBody
@RequestMapping("/api/v1/auth")
public class AdLoginController implements AdLoginControllerApi {
@Autowired
private LoginServcie loginServcie;
@PostMapping("/login")
public ResponseResult login(@RequestBody User user){
return loginServcie.login(user);
}
}
手动调用 authenticate中方法
配置类
//自定义controller调用AuthenticationManager中的authenticate方法
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
实现类
@Service
public class LoginServiceImpl implements LoginServcie {
@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);
}
}
边栏推荐
猜你喜欢

SAP ABAP Gateway Client 里 OData 测试的 PUT, PATCH, MERGE 请求有什么区别

中科磁业IPO过会:年营收5.5亿 吴中平家族持股85%

【QT】自定义工程封装成DLL并如何调用(带ui界面的)

【图像分类】2022-MPViT CVPR

麒麟信安邀您抢先看 | openEuler 志高远,开源汇智创未来-开放原子全球开源峰会欧拉分论坛最详细议程出炉

微信小程序--》条件与列表渲染以及WXSS模板样式

matlab常微分方程在传染病建模中的应用

【遥控器开发基础教程5】疯壳·开源编队无人机-SPI(2.4G 双机通信)

RollBack Rx Professional RMC 安装教程

嵌入式开发:嵌入式基础——’ ’和” ”的区别
随机推荐
Introduction to resubmit Progressive Anti-Duplicate Submission Framework
线上交流丨稀疏神经网络:实践和理论(青源Talk第23期 汪张扬)
【多线程】Thread类的基本用法
matlab常微分方程在传染病建模中的应用
NLP commonly used Backbone model cheat sheet (1)
吴恩达深度学习deeplearning.ai——第一门课:神经网络与深度学习——第二节:神经网络基础(上)
2022/8/2 考试总结
flutter 时间戳转日期
【飞控开发高级教程2】疯壳·开源编队无人机-遥控整机代码走读、编译与烧写
接口流量突增,如何做好性能优化?
TensorFlow学习记录(一):基本介绍
Servlet——请求(request)与响应(response)
Understand the next hop address in the network topology in seconds
记一次sql优化Using temporary; Using filesort
增删改查这么多年,最后栽在MySQL的架构设计上!
RollBack Rx Professional RMC 安装教程
吴恩达深度学习deeplearning.ai——第一门课:神经网络与深度学习——第一节:深度学习概论
7.29
Vite教程 安装
电压传感器: 工作原理、类型及电路图