我正在尝试使用新的Spring Boot 1.3.5版本让我的Web应用程序再次运行,但是百日咳方言似乎不再起作用了。
我添加了
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
到我的.pom,甚至在我的安全配置中注册了一个bean:
@Bean
public SpringSecurityDialect springSecurityDialect(){
SpringSecurityDialect dialect = new SpringSecurityDialect();
return dialect;
}
(虽然我认为春季靴子无论如何都会为我做这件事)。温使用像e这样的表达式。 G。
<li sec:authorize="hasRole('SITE_ADMIN') || hasRole('TENANT_ADMIN')">Admin
</li>
表达式不会被渲染,因为虽然我可以将自定义User元素注入控制器,但角色似乎为null:
@RequestMapping(value="/", method=RequestMethod.GET)
public String homePage(@AuthenticationPrincipal VZUser user, Model model){
model.addAttribute("email", user.getEmail());
return "home/index";
}
从调试开始,我看到注入的Principal对象不为null,但模板似乎无法解析sec:objects。我删除了xmlns命名空间并重新插入它没有效果。关于这个功能的文档非常令人震惊。我错过了什么?
噢,是的。相同的代码(没有新的依赖项和xhtml模板中的命名空间声明)在Spring Boot 1.3.2中运行...更新
我认为这与我使用自定义UserDetailsService的事实有关。我对内存服务没有任何问题。但是,我的自定义用户实现只有以下内容:
@Override
public Collection<? extends GrantedAuthority> getAuthorities(){
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for(VZUserRoles role: roles){
authorities.add(new SimpleGrantedAuthority(role.name()));
}
return authorities;
}
我定义了一个基本的UserDetails服务并将其放在AuthenticationMAnagerBuilder中。身份验证工作正常,它似乎没有传递给视图。
答案 0 :(得分:3)
确实,您不需要定义SpringSecurityDialect
bean,它是通过Spring Boot自动配置为您完成的。
我的例子中没有看到任何错误,我试图重现这个问题而没有成功。
具有以下依赖项:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
一个简单的控制器:
@Controller
public class HomeController {
@RequestMapping("/")
public String home() {
return "index";
}
}
自定义安全配置:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("brian").password("password").roles("USER");
}
}
index.html模板:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
</head>
<body>
<h2>Thymleaf example</h2>
<p sec:authorize="hasRole('ROLE_USER')">
Authenticated
</p>
<p th:text="${#authentication.principal.username}">the_username</p>
</body>
</html>
一切都按预期工作。
拥有create an issue后,您可以随意minimal repro project。
答案 1 :(得分:1)
我找到了一种解决方法,它假设与Spring Security 4处理角色的方式有关。
sec:authorize="hasAuthority('SITE_ADMIN')"
工作得很好