二次猿二 2024-05-29 01:17 采纳率: 33.3%
浏览 23

权限认证推荐用Sa-Token吗?

请问分布式Spring项目,权限认证推荐用Sa-Token吗?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-29 01:17
    关注

    引自免费微信小程序:皆我百晓生

    在设计一个分布式Spring项目的权限认证时,可以考虑使用多种技术方案,包括但不限于OAuth 2.0、JWT(JSON Web Tokens)、Spring Security等。Sa-Token 是一个基于 JWT 的权限管理框架,它提供了一些额外的功能,比如全局唯一ID生成、Token 过期自动刷新、以及与 Spring Boot 集成良好等特性。

    如果你的项目对以下功能有需求,那么 Sa-Token 可能是一个不错的选择:

    1. 基于 JWT 的轻量级认证。
    2. 自动 Token 刷新机制。
    3. 支持单点登录(SSO)。
    4. 简洁易用的 API 和文档。

    但是,如果你已经熟悉 Spring Security 或者对 OAuth 2.0 等其他授权协议更熟悉,那么可能不需要引入额外的框架。Spring Security 提供了全面的安全解决方案,包括权限控制、会话管理、OAuth 2.0 等。

    如果你决定使用 Sa-Token,以下是基本步骤:

    首先,添加依赖到 pom.xml 文件中:

    <dependency>
        <groupId>com.alicp</groupId>
        <artifactId>sa-token</artifactId>
        <version>4.6.5</version>
    </dependency>
    

    然后,在配置类中启用 Sa-Token:

    @Configuration
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class SecurityConfig extends GlobalAuthenticationConfigurerAdapter {
    
        @Autowired
        private Sa-TokenProperties properties;
    
        @Override
        public void init(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .withUser("admin").password(passwordEncoder().encode("password")).roles("ADMIN");
        }
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return NoOpPasswordEncoder.getInstance();
        }
    
        @Bean
        public SaTokenFilter authenticationTokenFilterBean() throws Exception {
            SaTokenFilter filter = new SaTokenFilter();
            filter.setAuthenticationManager(authenticationManager());
            filter.setJwtService(jwtService());
            return filter;
        }
    
        @Bean
        public JwtService jwtService() {
            return new JwtServiceImpl(properties);
        }
    }
    

    接着,你需要创建一个 UserDetailsService 实现,用于验证用户信息:

    @Service
    public class CustomUserDetailsService implements UserDetailsService {
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            // 在这里从数据库或其他源获取用户信息
            User user = userService.getUser(username);
            if (user == null) {
                throw new UsernameNotFoundException("User not found with username: " + username);
            }
            return new org.springframework.security.core.userdetails.User(
                    user.getUsername(),
                    user.getPassword(),
                    AuthorityUtils.createAuthorityList(user.getRole())
            );
        }
    }
    

    最后,定义一个过滤器来处理请求中的 Token:

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class AuthRequestFilter extends OncePerRequestFilter {
    
        @Autowired
        private CustomUserDetailsService userDetailsService;
    
        @Autowired
        private JwtService jwtService;
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
                throws ServletException, IOException {
            try {
                String token = extractToken(request);
                if (StringUtils.hasText(token)) {
                    Authentication authentication = jwtService.getAuthentication(token);
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                }
            } catch (Exception e) {
                // 处理 Token 解析异常
            }
            chain.doFilter(request, response);
        }
    
        private String extractToken(HttpServletRequest request) {
            String authorizationHeader = request.getHeader("Authorization");
            if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
                return authorizationHeader.substring(7);
            }
            return null;
        }
    }
    

    这只是一个基础的示例,实际应用中你可能还需要根据业务需求进行调整。例如,实现 Token 刷新逻辑、错误处理、角色和权限映射等。

    记住,选择技术方案时,确保它能满足你的具体需求,并且团队成员对该技术有一定的了解和经验。如果你对 Spring Security 已经非常熟悉,那么可能不需要引入 Sa-Token,而是直接利用 Spring Security 的强大功能进行权限管理和认证。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月29日

悬赏问题

  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys