在Spring Boot项目中,我想绕过一些" magic"令牌。例如,我得到一个请求标头参数为授权:Bearer abcdef-xyz 。如果这不是有效的访问令牌,我将检查我的预定义令牌。如果其中一个匹配,我将为安全上下文创建一个虚拟用户,并允许请求继续。
答案 0 :(得分:1)
由于您了解安全风险,请查看以下解决方案是否有效。
请求头参数作为授权:Bearer abcdef-xyz
Spring-boot不支持开箱即用,如果你想要这个解决方案,你将不得不编写自定义实现,这可能很复杂。
相反,您可以查看一个解决方案,在该解决方案中,您可以使用所需的低级授权权限创建Long过期令牌,并要求您的客户发送此令牌
要实现此目的,请将accessTokenValiditySeconds设置为Zero或Negative以将令牌设置为非过期令牌
答案 1 :(得分:0)
我找到了实现这个目标的方法。
如果已经过验证,那么您可以创建虚拟身份验证并调用 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); }