当前位置:网站首页>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);
}
}
边栏推荐
猜你喜欢
随机推荐
稳压电源: 电路图及类型
线性DP
如何正确地配置入口文件?
作业8.2 线程同步互斥机制——互斥锁
暴力递归到动态规划 08(小马走象棋)
Jenkins汉化设置
做快乐的事情
微信小程序--》条件与列表渲染以及WXSS模板样式
【QT】自定义工程封装成DLL并如何调用(带ui界面的)
minio 单机版安装
【Gopher 学个函数】边学边练,简单为 Go 上个分
Vite教程 安装
电压传感器: 工作原理、类型及电路图
浅谈I2C知识
文树勋率长沙市人大常委会主任会议成员莅临麒麟信安调研数字经济发展情况
吴恩达深度学习deeplearning.ai——第一门课:神经网络与深度学习——第二节:神经网络基础(上)
ASP.NET网络版进销存管理系统源码【源码免费分享】
2022-08-02:小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,
【深度学习】基于tensorflow的小型物体识别训练(数据集:CIFAR-10)
PAT甲级 1051 Pop Sequence