2016-06-23 3 views
1

Я пытаюсь заставить мое веб-приложение снова работать с новой версией Spring Boot версии 1.3.5, но диалект тимелеафа больше не работает.Thymeleaf Security не работает с Spring Boot 1.3.5

Я добавил

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

моего .pom и даже зарегистрировал боб в моей конфигурации безопасности:

@Bean 
public SpringSecurityDialect springSecurityDialect(){ 
    SpringSecurityDialect dialect = new SpringSecurityDialect(); 
    return dialect; 
} 

(хотя я предполагаю, весной загрузка будет делать это для меня во всяком случае). Вэнь, используя выражения типа e. г.

<li sec:authorize="hasRole('SITE_ADMIN') || hasRole('TENANT_ADMIN')">Admin 
</li> 

выражение не будет оказано, как роль, кажется, быть пустым, хотя я могу привнести свой пользовательский элемент User в контроллер:

@RequestMapping(value="/", method=RequestMethod.GET) 
public String homePage(@AuthenticationPrincipal VZUser user, Model model){ 
    model.addAttribute("email", user.getEmail()); 
    return "home/index"; 
} 

С отладки, я вижу Основной объект впрыскиваемого не null, но шаблон, похоже, не способен анализировать объекты sec:. Я удалил пространство имен xmlns и ввел его без эффекта. И документация по этой функции довольно откровенно ужасающая. Что-нибудь я пропустил?

О да. Тот же самый код (без новой зависимости и с объявления пространства имен в шаблоне XHTML) работал в Spring ботинке 1.3.2 ...

UPDATE

Я думаю, это связано с тем, что я используйте пользовательский 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 службы и положить его в Int AuthenticationMAnagerBuilder. Аутентификация работает отлично, она просто не кажется переданной вместе с представлением.

+0

Решение этой проблемы описано в: http://stackoverflow.com/questions/41388332/thymeleaf-3-0-spring-boot-security-integration-does- не работает –

ответ

1

Я нашел обходное решение, которое, предположительно, связано с тем, как Spring Security 4 обрабатывает роли.

sec:authorize="hasAuthority('SITE_ADMIN')" 

прекрасно работает

3

Действительно, вам не нужно определять фасоль SpringSecurityDialect, это сделано для вас при автоматической конфигурации 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.

+0

Спасибо! У меня нет никаких проблем, пока я использую функцию Memory UserDetailsService. Однако, сохранив мои учетные записи в MongoDB, мне нужна специальная служба (которая отлично работает для аутентификации, кстати). – thomi

+0

, то, может быть, проблема заключается в том, что пользовательский сервис (не соблюдая основной контракт или не заполняя роли?), А не расширение Thymeleaf здесь ... –

+0

Может быть. Однако я могу использовать $ {# authentication.principal.authorities}. Так что Принципал есть. Возможно, сейчас я только что займусь проблемой. Как я сказал. До Spring Boot 1.3.5 не было проблем с тем же кодом. – thomi

Смежные вопросы