如何在Spring Boot中使用预定义标记绕过Oauth2身份验证?

时间:2018-03-07 14:33:49

标签: java spring-boot oauth-2.0 token

在Spring Boot项目中,我想绕过一些" magic"令牌。例如,我得到一个请求标头参数为授权:Bearer abcdef-xyz 。如果这不是有效的访问令牌,我将检查我的预定义令牌。如果其中一个匹配,我将为安全上下文创建一个虚拟用户,并允许请求继续。

2 个答案:

答案 0 :(得分:1)

由于您了解安全风险,请查看以下解决方案是否有效。

  

请求头参数作为授权:Bearer abcdef-xyz

Spring-boot不支持开箱即用,如果你想要这个解决方案,你将不得不编写自定义实现,这可能很复杂。

相反,您可以查看一个解决方案,在该解决方案中,您可以使用所需的低级授权权限创建Long过期令牌,并要求您的客户发送此令牌

要实现此目的,请将accessTokenValiditySeconds设置为Zero或Negative以将令牌设置为非过期令牌

答案 1 :(得分:0)

我找到了实现这个目标的方法。

  • 覆盖 InMemoryTokenStore
  • 上的 readAccessToken 方法
  • 根据您的需要检查令牌值
  • 如果令牌符合您的模式,请从令牌获取相关信息并验证
  • 如果已经过验证,那么您可以创建虚拟身份验证并调用 storeAccessToken 方法

    public OAuth2AccessToken readAccessToken(String tokenValue) {
    Pattern pattern = Pattern.compile(HRN_REGEX);
    Matcher matcher = pattern.matcher(tokenValue);
    OAuth2AccessToken oAuth2AccessToken = super.readAccessToken(tokenValue);
    if (oAuth2AccessToken == null && matcher.find()) {
        String group = matcher.group();
        String companyStr = group.replace(LICENCE_TOKEN_PREFIX, "");
        Long companyId= Long.valueOf(companyStr);
        boolean isCompanyValid = mLoginUserService.validateCompanyIdForAnonymousLogin(companyId);
        if (isCompanyValid) {
            OAuth2Request storedReq = new OAuth2Request(generateDummyReqParameters(), CLIENT, null, true, generateScope(), generateResourceIds(), null, null, null);
            Authentication userAuth = new AnonymousAuthenticationToken(companyStr, companyId, AuthorityUtils.createAuthorityList(ROLE_COMPANY));
            OAuth2Authentication authentication = new OAuth2Authentication(storedReq, userAuth);
            storeAccessToken(new DefaultOAuth2AccessToken(tokenValue), authentication);
            return new DefaultOAuth2AccessToken(tokenValue);
        } else {
            throw new InvalidTokenException(COMPANY_IS_NOT_LICENCED);
        }
    }
    return oAuth2AccessToken;}
    
  • 为此身份验证授予角色(" ROLE_COMPANY "在我的情况下)

  • 在您的ResourceServerConfigurerAdapter类中覆盖 configure(HttpSecurity http)方法并将此角色授予相关端点

    public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/tools/validate/**").hasAnyAuthority(ROLE_COMPANY, ROLE_USER, ROLE_ADMIN)
            .anyRequest().hasAnyAuthority(ROLE_USER, ROLE_ADMIN);    }