我从以下文件开始,使用 Spring 安全性和 OAuth2 配置 URL 和受保护的路径:
@EnableResourceServer
@RestController
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter
{
@RequestMapping("/publica")
public String publico() {
return "Pagina Publica";
}
@RequestMapping("/privada")
public String privada() {
return "Pagina Privada";
}
@RequestMapping("/admin")
public String admin() {
return "Pagina Administrador";
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().antMatchers("/oauth/token", "/oauth/authorize**", "/publica").permitAll();
http
.requestMatchers().antMatchers("/privada")
.and().authorizeRequests()
.antMatchers("/privada").access("hasRole('USER')")
.and().requestMatchers().antMatchers("/admin")
.and().authorizeRequests()
.antMatchers("/admin").access("hasRole('ADMIN')");
}
}
这工作正常。如果我尝试在邮递员中访问/privada
它会返回 401。
但是,对于我计划从中构建的应用程序,我认为最好在自己的控制器中组织URL(例如FundsController,UsersController,ProductsController等(
因此,作为上面的一个基本示例,我将路径映射方法移到 BasicController 中:
@RestController
public class BasicController
{
@RequestMapping("/publica")
public String publico() {
return "Pagina Publica";
}
@RequestMapping("/privada")
public String privada() {
return "Pagina Privada";
}
@RequestMapping("/admin")
public String admin() {
return "Pagina Administrador";
}
}
但是将安全内容保留在资源服务器配置中:
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter
{
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().antMatchers("/oauth/token", "/oauth/authorize**", "/publica").permitAll();
http
.requestMatchers().antMatchers("/privada")
.and().authorizeRequests()
.antMatchers("/privada").access("hasRole('USER')")
.and().requestMatchers().antMatchers("/admin")
.and().authorizeRequests()
.antMatchers("/admin").access("hasRole('ADMIN')");
}
}
但是现在当我重新启动应用程序(内存中访问令牌已销毁(然后转到/privada
它返回Pagina Privada
我认为是西班牙语的"私人页面":)无论如何都不需要访问令牌,这不是我想要的。当它都在同一类中时,它应该像以前一样返回 401。我哪里做错了?
添加
@Configuration
@EnableWebSecurity
对资源服务器配置类的注释和 扩展WebSecurityConfigurerAdapter
而不是ResourceServerConfigurerAdapter
.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/context"))
.antMatchers("/context/**").fullyAuthenticated();