sec:授权在thymeleaf视图中为isAuthenticated()和isAnonymous()返回true

时间:2015-10-02 10:01:41

标签: spring spring-security thymeleaf

在我目前的spring-boot项目中,我在我的视图中看到了这样的代码片段:

<div class="account">
    <ul>
        <li id="your-account" sec:authorize="isAnonymous()">
            ... code 1 ...
        </li>
        <li id="your-account" sec:authorize="isAuthenticated()">
            ... code 2 ...
        </li>
        <li th:if="${cart}">
            ...
        </li>
    </ul>
</div>

其中只应在同一时间显示其中一个片段1或2。但是现在,当我在浏览器中打开这个视图时,正在显示这两个区域。

任何人都可以看到这里有什么问题?

ps:我的thymeleaf配置类是这样的:

@Configuration
public class Thymeleaf {

  @Bean
  public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine  =  new SpringTemplateEngine();

    final Set<IDialect> dialects = new HashSet<IDialect>();
    dialects.add( new SpringSecurityDialect() );
    engine.setDialects( dialects );

    return engine;
  }

}

ps:我的spring-security配置类是:

@Configuration
@ComponentScan(value="com.spring.loja")
@EnableGlobalMethodSecurity(prePostEnabled=true)
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        private UserDetailsService userDetailsService;

        @Autowired
        private SocialUserDetailsService socialUserDetailsService;

        @Autowired
        private PasswordEncoder passwordEncoder;

        @Autowired
      private AuthenticationManagerBuilder auth;

        @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()
            .authorizeRequests()
                .antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**").permitAll()
                .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/signin")
                    .loginProcessingUrl("/login").permitAll()
                    .usernameParameter("login")
                    .passwordParameter("senha")
                    .and()
                .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/")
                    .and()
                .apply(new SpringSocialConfigurer());
    }

        @Override
        public void configure(WebSecurity web) throws Exception {
            DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
        handler.setPermissionEvaluator(new CustomPermissionEvaluator());
        web.expressionHandler(handler);
    }

        @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder);
    }

        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return auth.getOrBuild();
        }
}

5 个答案:

答案 0 :(得分:11)

我的解决方法是将thymeleaf-extras-springsecurity4添加到我的网络应用依赖项中。

我有一个父pom导入spring boot(1.4.1.RELEASE),其中包括thymeleaf extras,但是我的孩子pom(包含web应用程序代码)需要调出特定的thymeleaf extras依赖,如此:

<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity4</artifactId> </dependency>

瞧......它现在有用了。

我试图在百万富翁模板(.html文件)中执行<div sec:authorize="hasRole('ROLE_USER')"></div>,以便在用户登录时仅显示div及其内容。但是,它始终显示div。

我希望它会抛出一个错误,说它在包含百万美元额外依赖之前无法识别弹簧安全标签......它会使调试变得更容易。

答案 1 :(得分:3)

这可能是因为你的类路径上缺少百合花 - 额外 - 弹簧安全4神器。我遇到了这个问题,并发现(在把我的大部分头发拉出来之后)SpringSecurity方言没有加载到百里香,因为罐子的缺席。通过以下方式添加了此依赖项:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>

希望这会有所帮助。见https://stackoverflow.com/a/31622977/4091838

答案 2 :(得分:0)

尝试了上述所有方法,但对我不起作用,但是可能对其他人有用。对我有用的是:

<properties>
    <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
    <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
    <thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

这是我的百里香叶的配置设置:

@Bean
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(thymeleafTemplateResolver());
    templateEngine.setEnableSpringELCompiler(true);
    templateEngine.addDialect(new SpringSecurityDialect());
    return templateEngine;
}

@Bean
public SpringResourceTemplateResolver thymeleafTemplateResolver() {
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setPrefix("classpath:templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setCacheable(false);
    templateResolver.setTemplateMode(TemplateMode.HTML);
    return templateResolver;
}

@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setCharacterEncoding("UTF-8");
    return viewResolver;
}

答案 3 :(得分:-1)

在您的配置中,您已将所有网址设置为匿名访问

.antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**").permitAll()

试试这个

.antMatchers("/b3/**", "/v1.1/**", "/**", "/destaque/**", "/categoria/**")
    .anyRequest().authenticated()
                .and()

由于permitAll(),匿名用户以及经过身份验证的用户都可以访问所有URL,因此两者都可以显示。尝试切换机箱以避免此类陷阱。

答案 4 :(得分:-2)

在我改变的情况下

spring.jpa.hibernate.ddl-auto=auto

spring.jpa.hibernate.ddl-auto=none
application.properties 文件中的

是解决方案。