在尝试实现 Spring Security 和 OAuth2 时,我已经能够通过一个包含 2 个 servlet 的非常简单的示例来完成工作,但是在保护其中一个 servlet 访问时遇到了问题:“AdminTestServlet”应该只授权给具有角色的用户“行政”。它在使用 WebSecurityConfigurerAdapter 的“配置”方法时起作用(参见 antMatchers):
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(jsr250Enabled = true, securedEnabled = true, prePostEnabled = true)
public static class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorize -> authorize
.antMatchers("/AdminTestServlet").hasAnyRole("ADMIN")
.anyRequest().authenticated()
.and()
)
.oauth2Login(withDefaults());
}
[...]
}
但现在我想删除 antMatchers 并通过注释设置授权。理想情况下,它应该是标准的 JavaEE 注释(用于 servlet 的 @ServletSecurity)。但是在尝试在 Admin servlet 上设置它们时它不起作用(即,如果我有 ADMIN 角色,我总是会收到 403 错误事件):
@WebServlet(value = "/AdminTestServlet")
@DeclareRoles("ADMIN")
@ServletSecurity(@HttpConstraint(rolesAllowed={"ADMIN"}))
public class AdminTestServlet extends HttpServlet {
protected void doGet(...) {
[...]
}
}
顺便说一句,我也没有使用 Spring 特定的注释(@Secured):总是允许访问(没有 403)。有很多关于在依赖 JSR-250 的 JAX-RS 端点上设置授权注释的帖子:@RolesAllowed。但是我找不到任何关于 Servlet 这样做的信息。如果有人可以帮助我。也许这是不可能的?
谢谢