2013-03-22 7 views
2

У меня есть объект User, и каждый пользователь, который существует, должен иметь 1 или более конкретных ролей/полномочий. Например, adminuser и так далее. Таким образом, я создал authorities таблицу с 2 полями (username и authority) В моей application-context-securtiy.xml у меня естьполучить все полномочия конкретного пользователя

<jdbc-user-service id="userService" data-source-ref="dataSource" 
    users-by-username-query=" 
     select nickname, password, true from users where nickname=?" 
    authorities-by-username-query= "select username, authority AS authorities 
    from authorities where username=?" 
/> 

, который работает достаточно хорошо.

Сейчас я пытаюсь создать файл jsp, в котором перечислены все мои пользователи и их роли/полномочия, но я не могу сделать что-то вроде user.getAuthorites() и распечатать их в jsp.

Я уже пробовал реализованный UserDetailsService, но я не знаю, как подключить мой User и UserDetailsService.

Надеюсь, вы можете дать мне несколько советов.

Edit: часть СПЯ, как я хотел бы использовать:

<tbody> 
<c:forEach var="user" varStatus="stats" items="${users}"> 
    <tr> 
     <td> 
      <c:out value="${user.nickname}" /> 
      <c:forEach var="role" varStatus="status_" items="${user.getAuthorities()}"> 
       <c:out value="${role}" /> 
      </c:forEach> 
     </td> 
     <td>test</td> 
     <td>options</td> 
    </tr> 
</c:forEach> 
</tbody> 

Как отправить данные из контроллера на мой взгляд:

@RequestMapping(value = "/manageUsers", method = RequestMethod.GET) 
public String startManageUsers(ModelMap model, Principal principal) { 
    List<User> list = userService.getUsers(); 
    model.addAttribute("users", list);  
    return "showUsers"; 
} 
+0

Вы можете показать свой код JSP? – Qwerky

+2

'items =" $ {user.getAuthorities ('} "'? Удалить missmatched paren и' в конце. Кроме того, вы, вероятно, хотите 'items = '$ {user.authorities}" ' – Xaerxess

+0

Да, это была просто опечатка. .. Я не знаю, как реализовать материал, который будет работать таким образом вообще – soupdiver

ответ

1

Я думаю, что лучший способ сделайте это, чтобы реализовать UserDetailsService и UserDetails.

Пример реализации UserDetailsService.

@Service 
@Transactional 
public class UserLoginService implements UserDetailsService { 

    @Autowired 
    private UserService userService; 

    @Override 
    public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { 
     UserEntity userEntity = this.userService.getUserByUserId(userId); 
     if (userEntity == null) { 
      throw new UsernameNotFoundException("User not found"); 
     } 

     UserLoginBean bean = new UserLoginBean(userEntity.getId(), userEntity.getUserId(), userEntity.getPassword(), userEntity.getEnabled()); 
     bean.setFullname(userEntity.getFullname()); 
     bean.setUserEntity(userEntity); 

     Set<GrantedAuthority> roles = new HashSet<GrantedAuthority>(); 
     roles.add(new SimpleGrantedAuthority(userEntity.getRole())); 
     bean.setAuthorities(roles); 

     return bean; 
    } 

} 

Пример реализации UserDetails.

public class UserLoginBean implements UserDetails { 

    private static final long serialVersionUID = 1L; 

    private Long id; 
    private String fullname; 
    private String username; 
    private String password; 
    private boolean locked; 
    private Set<GrantedAuthority> authorities = null; 

    private UserEntity userEntity; 

    public UserLoginBean(Long id, String username, String password, boolean locked) { 
     this.id = id; 
     this.username = username; 
     this.password = password; 
     this.locked = locked; 
    } 

    public boolean isAccountNonExpired() { 
     return true; 
    } 

    public boolean isAccountNonLocked() { 
     return locked; 
    } 

    public boolean isCredentialsNonExpired() { 
     return true; 
    } 

    public boolean isEnabled() { 
     return true; 
    } 

    public Set<GrantedAuthority> getAuthorities() { 
     return authorities; 
    } 

    public void setAuthorities(Set<GrantedAuthority> authorities) { 
     if (this.authorities == null) { 
      this.authorities = authorities; 
     } 
    } 

    // setters, getters 
    } 

Последнее, что нужно сделать, чтобы установить весеннюю безопасность для UserLoginService в качестве поставщика аутентификации.

Пример:

<security:authentication-manager alias="authenticationManager"> 
     <security:authentication-provider user-service-ref="userLoginService"> 
     <security:password-encoder ref="userPasswordEncoder"/> 
     </security:authentication-provider> 
    </security:authentication-manager> 

    <bean 

    <bean id="userLoginService" class="com.stackoverflow.UserLoginService" /> 

На странице JSP необходимо добавить:

<%@ taglib prefix="a" uri="http://www.springframework.org/security/tags"%> 

<a:authentication property="principal" var="principal" /> 

Теперь вы можете получить доступ все вещи в UserLoginBean.

<c:if test="${not empty principal && principal != 'anonymousUser'}"> 
     <c:set var="fullname"><c:out value="${principal.fullname}" /></c:set> 
    </c:if> 
+0

извините, но это слишком далеко в прошлом, и я не больше в этот проект, поэтому я не могу подтвердить ваш ответ: / – soupdiver