Java 如何在spring security oauth2中进行权限访问控制?

Java 如何在spring security oauth2中进行权限访问控制?,java,spring,spring-security-oauth2,Java,Spring,Spring Security Oauth2,我试图使用spring security oauth2对@PreAuthorize(“hasAuthority('perm2'))或WebSecurityConfigureAdapter中的安全配置等注释进行权限访问控制。但是,当我尝试访问@PreAuthorize(“hasAuthority('perm2'))注释的api时,我总是得到403禁止在我由具有“perm2”权限的用户登录后。我在ClientDetailsUserDetailsService中设置了断点,但加载的UserDetail

我试图使用spring security oauth2对@PreAuthorize(“hasAuthority('perm2'))或WebSecurityConfigureAdapter中的安全配置等注释进行权限访问控制。但是,当我尝试访问@PreAuthorize(“hasAuthority('perm2'))注释的api时,我总是得到403禁止在我由具有“perm2”权限的用户登录后。我在ClientDetailsUserDetailsService中设置了断点,但加载的UserDetails不包含任何权限。此外,我发现我可以从AuthoritysExtractor中提取包含“perm2”的权限。
一种方法是重写UserDetailService,这样我就可以通过AuthoritiesExtractor将权限设置为UserDetails。但我的问题是:

这是最佳实践吗?还是我错过了什么

下面是我的代码,后面是

我的authserver代码在这里

@springboot应用程序
@EnableResourceServer
@RestController
公共类应用程序扩展了SpringBootServletilizer{
@GetMapping(“/user/me”)
公共主要用户(主要用户){
返还本金;
}
公共静态void main(字符串[]args){
SpringApplication.run(App.class,args);
}
@配置
@EnableAuthorizationServer
公共静态类AuthServerConfig扩展了AuthorizationServerConfigurerAdapter{
@自动连线
专用BCryptPasswordEncoder密码编码器;
@凌驾
公共无效配置(
AuthorizationServerSecurityConfigure(oauthServer)引发异常{
oauthServer.tokenKeyAccess(“permitAll()”)
.checkTokenAccess(“isAuthenticated()”);
}
@凌驾
公共无效配置(ClientDetailsServiceConfigurer客户端)引发异常{
clients.inMemory()
.withClient(“SampleClientId”)
.secret(passwordEncoder.encode(“secret”))
.authorizedGrantTypes(“授权代码”)
.scopes(“用户信息”)
.autoApprove(true)
.重定向URI(“http://localhost:8082/ui/login", "http://localhost:8083/ui2/login");
}
}
@配置
@订单(1)
公共静态类SecurityConfig扩展了WebSecurity配置适配器{
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.requestMatchers()
.antMatchers(“/login”,“/oauth/authorize”)
.及()
.授权请求()
.anyRequest().authenticated()
.及()
.formLogin().permitAll();
}
@凌驾
受保护的无效配置(AuthenticationManagerBuilder auth)引发异常{
auth.inMemoryAuthentication()
.withUser(“约翰”)
.password(passwordEncoder().encode(“123”))
.角色(“用户”)。权限(“perm1”)。和()
.withUser(“汤姆”)
.password(passwordEncoder().encode(“123”))
.角色(“用户”)
.当局(“perm1”、“perm2”);
}
@豆子
公共BCryptPasswordEncoder passwordEncoder(){
返回新的BCryptPasswordEncoder();
}
}
我的客户端配置如下:

@配置
@使能OAuth2SO
@SpringBoot应用程序
@EnableGlobalMethodSecurity(securedEnabled=true,Prespenabled=true)
公共类应用程序扩展了WebSecurity配置适配器{
@豆子
authorities提取器authorities提取器(){
返回新的FixedAuthoritiesExtractor();
}
@凌驾
public void configure(HttpSecurity http)引发异常{
http.antMatcher(“/**”)
.授权请求()
.antMatchers(“/”,“/login**”)
.permitAll()
.anyRequest()
.hasAuthority(“perm1”).anyRequest()
.authenticated();
}
公共静态void main(字符串[]args){
SpringApplication.run(App.class,args);
}
}
这是我的控制器:

@控制器
公共类MyController{
@GetMapping(“/securedPage”)
@预授权(“hasAuthority('perm2'))
公共字符串securedPage(){
返回“securedPage”;
}
@GetMapping(“/testPerm”)
@预授权(“hasAuthority('perm3'))
公共@ResponseBody
字符串testPerm(){
return“这不可能发生!”;
}
}
我所期望的是:
当我使用john登录时,访问securedPage时被禁止。
但当我与tom登录时,我可以访问securedPage

事实上,无论我登录谁,我都会得到下面的禁止页面

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri May 24 11:29:09 CST 2019
There was an unexpected error (type=Forbidden, status=403).
Forbidden

当此应用程序检索令牌内容时,您需要显示授权服务器返回的实际JSON。(此外,您还需要考虑很多问题——您有重复的启动器声明,安全定义到处都是,
SpringBootServletInitializer
用于基于war的遗留项目。)@chrylis cautiouslyoptimistic-没错。谢谢你,也很抱歉最近依赖。当此应用程序检索令牌内容时,你需要显示授权服务器返回的实际JSON。(此外,你的担心也很多——你有重复的启动程序声明,安全定义到处都是,而且
SpringBootServletInitializer
是用于基于战争的遗留项目。)@chrylis谨慎的光学-没错。谢谢你,很抱歉迟到了。