我有一个我认为是典型的应用程序,React前端和Sping Boot 作为后端。我正在尝试设置安全性,以使用Azure Active Directory对用户进行身份验证和授权。身份验证工作,但授权不工作
UI部分很简单,我使用MSAL进行身份验证并获得帐户。我可以在控制台日志中看到,从该Angular 来看一切正常。我还在令牌请求/响应中看到以下内容:https://login.microsoftonline.com/{XX}/oauth2/v2.0/token
scope: "User.Read profile openid email"
token_type: "Bearer"
我遇到的问题是在后端,我得到以下错误:
Failed to authorize filter invocation [GET /api/document/list] with attributes [hasAuthority('SCOPE_User.Read')] using AffirmativeBased [DecisionVoters=[org.springframework.security.web.access.expression.WebExpressionVoter@470b5213], AllowIfAllAbstainDecisions=false]
Sending JwtAuthenticationToken [Principal=org.springframework.security.oauth2.jwt.Jwt@43ebd8ff, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[]] to access denied handler since access is denied
正如您可以看到的,由于某些原因,在客户端我们没有获得用户有权访问的作用域(即User.Read)
Spring安全设置:
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain web(HttpSecurity http) throws Exception {
http.authorizeRequests((authorize) -> authorize
.mvcMatchers("/**").hasAuthority("SCOPE_User.Read") // .permitAll()
.anyRequest().authenticated())
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
return http.build();
}
}
在application.properties:
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://login.microsoftonline.com/{XX}/v2.0
1条答案
按热度按时间h79rfbju1#
非常敏感的是,“后端”是一个资源服务器,而不是客户端(在您的情况下,客户端是React应用程序)。
我对Azure AD没有足够的经验来进行分类,但我怀疑微软没有遵循常见的OpenID实践(
.well-known/openid-configuration
可从颁发者URI访问并公开JWKS_URI
),这导致Spring无法正确解析授权公钥。您是否尝试过设置
spring.security.oauth2.resourceserver.jwt.jwk-set-uri
来代替或补充spring.security.oauth2.resourceserver.jwt.issuer-uri
(issuer-uri
必须设置为iss
claim access-token中的确切值,即使尾部斜杠也很重要)?