我正在尝试使用Okta安全性来设置SpringBoot应用程序。该应用程序是在Okta中使用OIDC单页应用程序(使用授权代码流+ PKCE)配置的,因此我们没有可用的客户机密。我希望能够像@PreAuthorize一样在我的Web服务代码中使用方法级别的安全性,但是无论我做什么,它似乎都不起作用。使用PKCE时甚至可以使用方法级别的安全性,还是仅使用HttpSecurity级别?我只是错过了SpringSecurity这个难题中的重要部分吗?任何帮助将不胜感激。
下面是我的代码。
application.yml
okta:
oauth2:
issuer: <my-issuer>
audience: api://default
client-id: <my-client-id>
scopes: <my-scopes>
SecurityConfig.java
@EnableOAuth2Client
@Profile("okta")
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private ClientRegistrationRepository clientRegistrationRepository;
public OktaSecurityConfig(ClientRegistrationRepository clientRegistrationRepository){
this.clientRegistrationRepository = clientRegistrationRepository;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors()
.and()
.oauth2Login()
.authorizationEndpoint()
.authorizationRequestResolver(
new CustomAuthorizationRequestResolver(
clientRegistrationRepository,
DEFAULT_AUTHORIZATION_REQUEST_BASE_URI
)
);
Okta.configureResourceServer401ResponseBody(http);
}
}
控制器
@RestController
@CrossOrigin(origins = {"http://localhost:8080","http://localhost:4200"})
@RequestMapping("/api/myController")
public class MyController {
private StuffStatusDao stuffStatusDao;
@PreAuthorize("hasAuthority('readonly')")
public ResponseEntity<List<Stuff>> getStuffStatus() {
return ResponseEntity.ok(stuffStatusDao.getLabelStatus());
{
}