Spring Security配置httpsecurity

时间:2016-04-16 12:45:04

标签: java spring security spring-mvc spring-security

我正在第一次尝试使用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”并授权对特定网址的调用,但一般的想法是:

  1. 禁用根目录(和其他随机控制器映射)上的“转到登录页面”。
  2. 从ajax下拉(或其他)下进行基于ajax的手动身份验证。
  3. 当一个随机的非autherised用户在一个页面上碰撞时,在控制器上有一个@PreAuthorized,那么,只有这样,他才会被重定向。
  4. UPD:基本问题是仅在拒绝访问的情况下调用重定向到登录页面,允许基本站点视图和调用的匿名角色。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题(可能不像它看起来那么干净)。

  1. 您可以配置Spring Security Http Security,因此它不会要求在每个页面上登录:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    
    http.antMatcher("/**").authorizeRequests().anyRequest().permitAll();
    
  2. 要启用方法安全性(PreAuthorize(" hasRole(' ADMIN')")等),您需要添加注释:

    @EnableGlobalMethodSecurity(prePostEnabled = true)
    
  3. 之后你需要向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。