spring安全主体null /用户未登录permitAll路径

Aar*_*ski 2 spring spring-mvc spring-security spring-boot

我具有春季安全性,可确保我的应用程序中的某些路径安全,而另一些则保持开放状态以供匿名访问。我遇到的问题与我将访问权限保留为“ permitAll”的开放部分有关。我只想保护某些路径,以防止非ADMIN对其进行访问,但是我希望管理员用户在路径的开放部分时能够被识别。

胸腺模板(部分):

<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>
Run Code Online (Sandbox Code Playgroud)

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

String username = (principal != null ? principal.getName() : "ANONYMOUS");
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

/ 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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我转到此路径/ open(不受保护),则会看到:

Hello Spring Boot User ANONYMOUS!
Run Code Online (Sandbox Code Playgroud)

但是,如果我转到此路径/ form(表单登录受保护-登录后),则会看到:

Hello Spring Boot User admin! 
isAuthenticated 
isFullyAuthenticated
Run Code Online (Sandbox Code Playgroud)

因此,我认为这里可能存在多个问题。第一个是thymeleaf sec:authorize属性没有执行任何操作,第二个是,如果我处于受保护的路径下,看来我只能访问Principal和其他安全信息。

有没有一种方法可以只保护一个路径(和子路径),但可以在我的应用程序的其他任何地方访问Principal和Security数据?

Dav*_*yer 5

您的“ / open”资源未映射到任何安全过滤器。在我看来,您需要一个默认值WebSecurityConfigurer(默认路径模式为“ / **”)并标记为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();
    }
}
Run Code Online (Sandbox Code Playgroud)