我正在第一次尝试使用Spring Security并且真的陷入了这样的任务:我有一个默认的网页,应该是默认的非认证,我有一批控制器调用,我想要使用PreAuthorized注释进行保护。基本的想法是,我想禁用默认的“重定向到登录页面”,但仍然有机会运行Spring Security的方法安全组合。
我正在使用java配置,如下所示:
@Configuration
@EnableWebSecurity
public class SpringWebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/res/**"); // #3
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**").authorizeRequests().anyRequest().permitAll();
}
}
我知道(或者似乎明白)到目前为止我的所有电话都应该被允许(过去两天一直坐在这里,显然已经没有了想法)。
我想要保护的Controller方法是:
@PreAuthorize("hasRole('ADMIN')")
@RequestMapping(value="/admin", method = RequestMethod.GET)
public String getAdminPage(Model model){
return "admin";
}
我知道我可以使用antMatcher添加“/ ** / admin”并授权对特定网址的调用,但一般的想法是:
UPD:基本问题是仅在拒绝访问的情况下调用重定向到登录页面,允许基本站点视图和调用的匿名角色。
答案 0 :(得分:0)
回答我自己的问题(可能不像它看起来那么干净)。
您可以配置Spring Security Http Security,因此它不会要求在每个页面上登录:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**").authorizeRequests().anyRequest().permitAll();
要启用方法安全性(PreAuthorize(" hasRole(' ADMIN')")等),您需要添加注释:
@EnableGlobalMethodSecurity(prePostEnabled = true)
之后你需要向HttpSecurity对象添加一些内容来捕获" Access Denied和ect" (在其他一些stackoverflow问题线程中找到了这个):
http.exceptionHandling().authenticationEntryPoint(new AuthenticationEntryPoint() {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
if (authException != null) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().print("Unauthorizated....");
}
}
});
现在您可以使用@PreAutherized保护您的控制器和其他组件。希望这会对某人有所帮助。
但仍然有一件事 - 当用户未经授权而我试图访问某个preAuthorized页面时,会调用上面提到的异常处理程序,返回" Unauthorized ..."信息。但是当用户被授权并且我尝试使用不同的preAuthorized角色的页面时,我得到默认的403 Access Denied。