登录 Spring Security 后如何返回基本令牌?

Posted

技术标签:

【中文标题】登录 Spring Security 后如何返回基本令牌?【英文标题】:How to return Basic token after logging into Spring Security? 【发布时间】:2022-01-20 00:50:11 【问题描述】:

我在我的 Springboot 项目中使用基本授权。成功登录后,我可以检查后端网页,并在Network 选项卡中看到Authorization 的值为Basic YmNyeX323G5yb2xsdGVjaC5jb206cyE5c2RzZA

然后,我可以使用值 Basic YmNyeX323G5yb2xsdGVjaC5jb206cyE5c2RzZA 通过 Postman 向服务器发出请求,方法是将该值设置为 Authorization 值。

那么,我的问题是,我如何在登录后返回这个值?

这是我的SecurityConfiguration.java 文件:

@Configuration
@EnableConfigurationProperties
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 
    @Autowired
    MongoUserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable().authorizeRequests()
                .antMatchers("/", "/register").permitAll().anyRequest().authenticated()
                .and().logout(logout -> logout
                        .permitAll()
                        .clearAuthentication(true)
                        .logoutUrl("/logout")
                        .logoutSuccessUrl("/")
                        .invalidateHttpSession(true)
                        .deleteCookies("JSESSIONID"))
                .httpBasic()
                .and().sessionManagement().disable();
    

    @Bean
    public PasswordEncoder passwordEncoder() 
        return new BCryptPasswordEncoder();
    

    @Override
    public void configure(AuthenticationManagerBuilder builder) throws Exception 
        builder.userDetailsService(userDetailsService);
    

可以返回上述基本授权令牌的端点是什么样的?

【问题讨论】:

你不会... 基本身份验证令牌只不过是用: 分隔的base64 编码的用户名和密码。这是由浏览器完成的,它在服务器上被解码以检查用户名/密码。 【参考方案1】:
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
Object details = authentication.getDetails();

试试这个,可能有用,令牌详解

【讨论】:

我已经用过这个了,这个应该可以了。【参考方案2】:

您不这样做,只是因为基本身份验证不是这样工作的。

“令牌”(或者更确切地说是标头)在客户端上构建并发送到服务器。令牌只不过是 usernamepassword: 分隔,然后进行 Base64 编码。这是 HTTP 标准的一部分,只是由浏览器提供/完成。因此,在输入用户名/密码后,您的浏览器将创建一个包含该编码令牌的Authorization

所以你输入了

用户名:bcrynrolltech.com 密码:s!9sdsd

变成YmNyeX323G5yb2xsdGVjaC5jb206cyE5c2RzZAbcrynrolltech.com:s!9sdsd 编码为 Base64)。以Authorization: YmNyeX323G5yb2xsdGVjaC5jb206cyE5c2RzZA 发送到服务器。哪个可以使用相反的过程来解码它。 (就像我检索用户名/密码一样)。

然后在服务器上对令牌进行解码,在; 上拆分,并将分离的用户名和密码传递给身份验证机制进行验证。

因此,生成此“令牌”的不是服务器,也不是令牌,而只是编码的用户名和密码。

在WikiPedia 上有更多关于基本身份验证如何工作的深入信息。 RFC2617 和 RFC7617 非常详细地描述了该协议。

【讨论】:

以上是关于登录 Spring Security 后如何返回基本令牌?的主要内容,如果未能解决你的问题,请参考以下文章

授权后返回上一页,Spring Security AuthenticationSuccessHundler

Spring Boot + Spring Security Restful 登录

spring security使用自定义登录界面后,不能返回到之前的请求界面的问题

使用 Spring Security 成功登录后如何正确更新登录日期时间?

使用 Spring Security 成功登录后如何正确更新登录日期时间?

Grails + spring-security-core:用户登录后如何分配角色?