spring boot中常用的安全框架 Security框架 利用Security框架实现用户登录验证token和用户授权(接口权限控制)_springboot的安全框架

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

* User: Json
*


* Date: 2024/3/3
* security 安全框架
**/
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

@Autowired
private IYsUserService iYsUserService;

@Override
public UserDetails loadUserByUsername(String username) throws AuthenticationException {
    //根据用户名进行查询
    YsUser ysUser = iYsUserService.getUserByUserName(username);
    if(ObjectUtils.isEmpty(ysUser)) {
        //在用户登录的方法里 如果想让security 安全框架 正确抛出异常给前端 需要使用 BadCredentialsException
        // 只有使用了BadCredentialsException异常类
        // unsuccessfulAuthentication 这个方法里才能接收到异常 统一抛出
        // unsuccessfulAuthentication 这个方法是 认证失败调用的统一方法
        throw new BadCredentialsException("用户名不存在!");
    }

// if(ysUser.getStatus().intValue() == 0) {
// throw new ErpRuntimeException(“账号已停用”);
// }

    //根据userid查询用户操作权限数据
    List<String> userPermsList =new ArrayList<>();
   // List<String> userPermsList = sysMenuService.findUserPermsByUserId(ysUser.getId());
    //创建list集合,封装最终权限数据
    List<SimpleGrantedAuthority> authList = new ArrayList<>();
    if(!CollectionUtils.isEmpty(userPermsList)){
        //查询list集合遍历
        for (String perm : userPermsList) {
            authList.add(new SimpleGrantedAuthority(perm.trim()));
        }
    }

    return new CustomUser(ysUser, authList);

}

}


**3、 自定义一个秘密校验器 CustomMd5PasswordEncoder 实现** org.springframework.security.crypto.password.PasswordEncoder 接口



package com.oa.security.custom;

import com.oa.common.utils.MD5;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

@Component
public class CustomMd5PasswordEncoder implements PasswordEncoder {
public String encode(CharSequence rawPassword) {
return MD5.encrypt(rawPassword.toString());
}

public boolean matches(CharSequence rawPassword, String encodedPassword) {
    return encodedPassword.equals(MD5.encrypt(rawPassword.toString()));
}

}


**4、 创建一个过滤器 来验证token 比如 TokenLoginFilter**  
 继承 org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter  
 在方法里 定义四个方法 都是重写父类方法  
 定义一个构造方法  
 登录认证方法 获取输入的用户名和密码,调用方法认证 attemptAuthentication() 进行账号密码认证 认证实际就是执行了我们设置的第一步的内容  
 认证成功调用方法 successfulAuthentication() 如果认证成功 这个方法里 就处理比如生成token 存入权限 等  
 认证失败调用方法 unsuccessfulAuthentication() 如果认证失败 这个方法里 就处理失败的逻辑



package com.erp.init.security.filter;

import com.alibaba.fastj

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在Spring Security配置一个自定义的认证提供者,用于调用外部URL进行用户登录验证。可以实现`AuthenticationProvider`接口,重写`authenticate()`方法,用于验证用户身份。具体实现可以参考以下代码示例: ```java @Component public class CustomAuthenticationProvider implements AuthenticationProvider { @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String password = authentication.getCredentials().toString(); // 调用外部URL进行用户登录验证 if (externalUrlAuth(username, password)) { List<GrantedAuthority> authorities = new ArrayList<>(); authorities.add(new SimpleGrantedAuthority("ROLE_USER")); return new UsernamePasswordAuthenticationToken(username, password, authorities); } else { throw new BadCredentialsException("External authentication failed."); } } private boolean externalUrlAuth(String username, String password) { // 调用外部URL进行用户登录验证的具体实现 // ... return true; // 验证成功返回true,失败返回false } @Override public boolean supports(Class<?> aClass) { return aClass.equals(UsernamePasswordAuthenticationToken.class); } } ``` 然后,在Spring Security的配置类将自定义的认证提供者加入认证管理器: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationProvider authenticationProvider; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authenticationProvider); } // 其他配置... } ``` 接下来,需要在用户登录成功后生成token,并将token存储到Redis。可以在`CustomAuthenticationProvider`重写`successfulAuthentication()`方法,用于生成token和存储到Redis。具体实现可以参考以下代码示例: ```java @Component public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { @Autowired private RedisTemplate<String, Object> redisTemplate; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { // 验证用户身份的具体实现... // ... // 验证成功后生成token String token = generateToken(username); // 将token存储到Redis redisTemplate.opsForValue().set(token, userDetails, 30, TimeUnit.MINUTES); return new UsernamePasswordAuthenticationToken(username, password, authorities); } private String generateToken(String username) { // 生成token的具体实现... // ... return token; } @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { // 用户登录成功后生成token并存储到Redis String username = authResult.getName(); UserDetails userDetails = (UserDetails) authResult.getPrincipal(); String token = generateToken(username); redisTemplate.opsForValue().set(token, userDetails, 30, TimeUnit.MINUTES); // 将token放入响应头 response.setHeader("Authorization", token); } } ``` 需要注意的是,需要在Spring Boot配置Redis的连接信息和序列化方式。可以参考以下配置: ```yaml spring: redis: host: localhost port: 6379 password: database: 0 redis: template: defaultSerializer: org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值