当前位置: 首页 > 知识库问答 >
问题:

spring安全认证服务器

高博涉
2023-03-14

我正在研究云应用程序的身份验证服务部分,我创建了以下安全配置类。

@Configuration
@EnableWebSecurity
public class JwtSecurityConfig extends WebSecurityConfigurerAdapter {
private final PasswordEncoder encoder;
private final UserService userService;
private final JwtConstant jwtConstant;

@Autowired
public JwtSecurityConfig(PasswordEncoder encoder, UserService userService, JwtConstant jwtConstant) {
    this.encoder= encoder;
    this.userService = userService;
    this.jwtConstant = jwtConstant;
}

@Bean
public DaoAuthenticationProvider getAuthenticationProvider() {
    DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
    authenticationProvider.setPasswordEncoder(encoder);
    authenticationProvider.setUserDetailsService(userService);
    return authenticationProvider;
}

@Override
protected void configure(AuthenticationManagerBuilder auth) {
    auth.authenticationProvider(getAuthenticationProvider());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .addFilter(getAuthenticationFilter())
            .authorizeRequests()
            .antMatchers(HttpMethod.PUT, "/signup").permitAll()
            .anyRequest()
            .authenticated();
}

private AuthenticationFilter getAuthenticationFilter() throws Exception {
    return new AuthenticationFilter(authenticationManager(), jwtConstant);
}
}

我不太清楚configure(HttpSecurity http)方法的链方法。身份验证服务将只接收“登录”和“注册”请求。

  • 由于未授权任何内容,是否应删除authorizeRequests()方法?
  • 我不确定anyRequest().Authenticated()部分是否真的需要?

共有1个答案

陈宜修
2023-03-14

有几件事必须更改,但首先,您必须定义一个为每个请求提供jwt的方法,并且每个请求都应该提供一个包含用户名和密码的authrequest对象:

@RestController
public class WelcomeController {
    @Autowired
    private JwtUtil jwtUtil;
    @Autowired
    private AuthenticationManager authenticationManager;

    @PostMapping("/signup")
    public String generateToken(@RequestBody AuthRequest authRequest) throws Exception {
        try {
            authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(authRequest.getUserName(), authRequest.getPassword())
            );
        } catch (Exception ex) {
            throw new Exception("inavalid username/password");
        }
        return jwtUtil.generateToken(authRequest.getUserName());
    }
}

userdetailsservice中,您可以按照以下方式进行身份验证:

@Service
public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService {
    @Autowired
    private final UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        System.out.println("tried to loging : " + username);
        if(!Objects.isNull(username) && !"".equals(username)){

            Optional<User> user = userRepository.findUserByUserName(username);

            System.out.println(user.get());
            if(user.isPresent()){

                User userParam = user.get();
                return new org.springframework.security.core.userdetails.User(userParam.getUserName(),
                        userParam.getPassword(), new ArrayList<>());
            }
        }
        throw new UsernameNotFoundException("user does not exists or empty !!");
    }
}

对于配置端:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    private final UserDetailsService userDetailsService;
    @Autowired
    private final JwtFilter jwtFilter;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

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

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests().antMatchers("/signup").permitAll()
                .anyRequest().authenticated()
                .and().exceptionHandling().and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);;
    }
}

有关更多信息,您可以遵循我的Github分支验证示例

 类似资料:
  • 在安装指南中,我们展示了如何启用边车之间的双向TLS认证。 这些设置将应用于网格中的所有边车。 在本教程中,您将学习: 注解Kubernetes服务以禁用(或启用)一个选定服务的双向TLS身份验证。 修改Istio网格配置以解除控制服务的相互TLS身份验证。 在开始前 了解Isio双向TLS认证的概念。 熟悉验证Istio双向TLS认证。 参考安装指南中的说明,通过双向TLS认证安装Istio。

  • gRPC 被设计成可以利用插件的形式支持多种授权机制。本文档对多种支持的授权机制提供了一个概览,并且用例子来论述对应API,最后就其扩展性作了讨论。 马上将会推出更多文档和例子。 支持的授权机制 SSL/TLS gRP 集成 SSL/TLS 并对服务端授权所使用的 SSL/TLS 进行了改良,对客户端和服务端交换的所有数据进行了加密。对客户端来讲提供了可选的机制提供凭证来获得共同的授权。 OAut

  • Cookies 和 secure cookies 你可以使用 set_cookie 方法在用户的浏览器中设置 cookies: class MainHandler(tornado.web.RequestHandler): def get(self): if not self.get_cookie("mycookie"): self.set_cooki

  • 包括平台认证体系架构和安全告警等内容。 认证体系 认证体系主要包括认证源、域、项目、组、用户、权限、角色等信息。 安全告警 安全告警即实时监测系统中的安全告警事件,如异常登录等,当发现安全问题后,将会及时通知管理员用户进行处理等。

  • 介绍安全检查、安全告警、操作日志的内容。 安全检查 平台会根据系统内置规则扫描下图中的安全性较低的资源,用户可以按照费用优化处理资源,提升平台资源的安全性。详情请参考认证与安全-安全检查。 安全告警 安全告警即实时监测系统中的安全告警事件,如异常登录等,当发现安全问题后,将会及时通知管理员用户进行处理等。目前仅支持异常登录的安全告警事件,当用户连续登录失败后被锁定将会发送安全告警记录发送给锁定用户

  • 我使用Spring安全核心插件。我想在用户登录后立即将对象放入会话中。到目前为止,我发现插件中有。它有一个称为的方法,它似乎在成功进行身份验证后被调用。所以我决定创建另一个LoginController,它扩展了默认控制器并覆盖了此方法: 但是调试表明这个方法从来没有被调用过。出了什么问题?可能有另一种方法来做我想做的事吗?谢谢大家!