spring security principal null / user未登录permitAll路径

时间:2014-07-15 19:59:31

标签: spring spring-mvc spring-security spring-boot

我有弹簧安全保护我的应用程序中的一些路径,并让其他人打开匿名访问。我遇到的问题与我将访问权限保留为“permitAll”的开放部分有关。我只想保护某些路径不被非ADMIN访问,但我确实希望admin用户在路径的开放部分时能够识别。

Thymeleaf模板(部分):

<p>Hello Spring Boot User <span th:text="${username}"/>!</p>
<div sec:authorize="isAnonymous()">isAnonymous</div>
<div sec:authorize="isRememberMe()">isRememberMe</div>
<div sec:authorize="isAuthenticated()">isAuthenticated</div>
<div sec:authorize="isFullyAuthenticated()">isFullyAuthenticated</div>

注意:模型将用户名定义为:

String username = (principal != null ? principal.getName() : "ANONYMOUS");

Config(基于Java) - 正在使用多种类型的身份验证

@Configuration
public static class FormLoginConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/form/**").authorizeRequests().anyRequest().authenticated()
                .and().formLogin().permitAll().loginPage("/form/login").loginProcessingUrl("/form/login")
                .and().logout().logoutUrl("/form/logout").invalidateHttpSession(true).logoutSuccessUrl("/");
    }
}

@Order(45) // LOW
@Configuration
public static class BasicAuthConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/basic/**").authorizeRequests().anyRequest().authenticated()
                .and().httpBasic();
    }
}

/ open路径没有安全配置。只是一个控制器。 / form路径还有一个控制器。这些都是这样的(现在路径不同):

@Controller
@RequestMapping("/open")
public class OpenController extends BaseController {
    @RequestMapping({"", "/"})
    public String home(HttpServletRequest req, Principal principal, Model model) {
        commonModelPopulate(req, principal, model);
        return "home"; // name of the template
    }
}

如果我走这条路 / open (不受保护),我会看到:

Hello Spring Boot User ANONYMOUS!

但是如果我走这条路 / form (表格登录受保护 - 登录后)我看到:

Hello Spring Boot User admin! 
isAuthenticated 
isFullyAuthenticated

所以我认为这里可能存在多个问题。第一个是thymeleaf sec:授权属性没有做任何事情,第二个是我似乎只能访问Principal和其他安全信息,如果我在受保护的路径下。

有没有办法只保护一条路径(和子路径),但允许在我的应用中的其他地方访问Principal和安全数据?

2 个答案:

答案 0 :(得分:4)

你的&#39; / open&#39;资源未映射到任何安全筛选器。在我看来,您需要一个默认的WebSecurityConfigurer(使用默认路径模式&#34; / **&#34;)并标记为permitAll()。它应该比其他@Order更高,因此它可以作为后备。

@Order(67) // LOWEST
@Configuration
public static class NoAuthConfigurationAdapter extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().anyRequest().permitAll();
    }
}

答案 1 :(得分:0)

要访问spring安全性基础结构,您需要在所有路径(/ *)上配置spring安全性过滤器。您不需要permit-all http配置。您可以在web.xml(http://docs.spring.io/spring-security/site/docs/3.0.x/reference/security-filter-chain.html)中或以编程方式(http://docs.spring.io/spring-security/site/docs/3.2.4.RELEASE/apidocs/org/springframework/security/web/context/AbstractSecurityWebApplicationInitializer.html)添加过滤器。

相关问题