Spring Security возвращает гостя вместо UserDetails для Authentication.getPrincipal () - PullRequest
2 голосов
/ 10 марта 2011

Я пытаюсь реализовать Spring Security 3.1.0.M1, и я не могу заставить мое приложение установить Authentication.getPrincipal для моей пользовательской реализации UserDetails.Он всегда возвращает принципал «гость», когда я пытаюсь получить зарегистрированного пользователя.См. Метод getLoggedInUser ниже.

В Users.java (подразумевается UserDetails) метод getAuthorities никогда не вызывается, и, возможно, именно поэтому user_role не назначается.

to Возможно, я что-то неправильно настроил ... Я приложил схему своей реализации, надеясь, что кто-то может обнаружить мою ошибку.Спасибо за помощь!

public static Users getLoggedInUser() {
    Users user = null;
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null && auth.isAuthenticated()) {
        Object principal = auth.getPrincipal();
        if (principal instanceof Users) {
            user = (Users) principal;
        }
    }
    return user;
}

файл контекста безопасности (удалены определения xml и схемы):

<global-method-security secured-annotations="enabled">
</global-method-security>
<http security="none" pattern="/services/rest-api/1.0/**" />
<http security="none" pattern="/preregistered/**" />
<http access-denied-page="/auth/denied.html">
    <intercept-url
        pattern="/**/*.xhtml"
        access="ROLE_NONE_GETS_ACCESS" />
    <intercept-url
        pattern="/auth/**"
        access="ROLE_ANONYMOUS,ROLE_USER" />
    <intercept-url
        pattern="/auth/*"
        access="ROLE_ANONYMOUS" />
     <intercept-url
        pattern="/**"
        access="ROLE_USER" />
    <form-login
        login-processing-url="/j_spring_security_check.html"
        login-page="/auth/login.html"
        default-target-url="/registered/home.html"
        authentication-failure-url="/auth/login.html?_dc=45" />
    <logout logout-url="/auth/logout.html"
            logout-success-url="/" />
    <anonymous username="guest" granted-authority="ROLE_ANONYMOUS"/>
    <remember-me user-service-ref="userManager" key="valid key here"/>
</http>
<!-- Configure the authentication provider -->
<authentication-manager>
    <authentication-provider user-service-ref="userManager">
            <password-encoder ref="passwordEncoder" />
    </authentication-provider>
</authentication-manager>

Реализация UserDetails (Users.java):

public class Users implements Serializable, UserDetails {
    public Collection<GrantedAuthority> getAuthorities() {
     List<GrantedAuthority> auth = new ArrayList<GrantedAuthority>();
    auth.add(new GrantedAuthorityImpl("ROLE_USER"));
    return auth;
}

}

user-service-ref = "userManager" (UserManagerImpl.java):

 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
    Users user = null;
    try {
        user = userDAO.findByUsername(username);
    } catch (DataAccessException ex) {
        throw new UsernameNotFoundException("Invalid login", ex);
    }
    if (user == null) {
        throw new UsernameNotFoundException("User not found.");
    }
    return user;
}

1 Ответ

1 голос
/ 12 марта 2011

Вы не получаете ошибку компиляции в этой строке: auth.add("ROLE_USER");?

Я думаю, это должно быть: auth.add(new SimpleGrantedAuthority("ROLE_USER"));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...