loadUserByUsername не вызывается - PullRequest
2 голосов
/ 13 октября 2011

Я использую Spring Security 3, когда я ввожу неправильные данные, пользователь перенаправляется на ссылку входа-сбоя, но Spring Security не вызывает метод loadUserByUsername?Так как же происходит аутентификация, и Spring узнает, что учетные данные неверны?или у меня что-то не так с моей конфигурацией, пожалуйста, руководство.

страница входа:

<form action="/myapp/j_spring_security_check">
                        <h:graphicImage id="graphicImage1" style="height: 322px; left: 0px; top: 0px; position: absolute" url="/resources/images/LoginImage.jpg" width="560"/>
                        <h:outputLabel for="j_username" id="outputLabel1" style="left: 48px; top: 120px; position: absolute" value="Username:"/>
                        <h:outputLabel for="j_password" id="outputLabel2" style="left: 48px; top: 168px; position: absolute" value="Password:"/>
                        <h:inputText binding="#{login.username}" id="j_username" required="true"
                            style="left: 142px; top: 118px; position: absolute; width: 237px" />
                        <h:inputSecret binding="#{login.password}" id="j_password" required="true" style="left: 142px; top: 166px; position: absolute; width: 237px"/>
                        <h:commandButton   id="loginBtn" style="left: 144px; top: 240px; position: absolute" value="Login"/>
                        <h:commandButton action="#{login.reset}" id="resetBtn" style="position: absolute; left: 360px; top: 240px" value="Reset"/>
                        <h:outputText id="errorMessage" style="left:0px;top:300px;position:absolute"/>
                        <h:message errorClass="errorMessage"  for="j_username" fatalClass="fatalMessage" id="messages1" infoClass="infoMessage" showSummary="false"
                            style="height: 43px; left: 24px; top: 288px; position: absolute; width: 523px;color:red;" warnClass="warnMessage"/>
                      </form>

security.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security"  
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
          http://www.springframework.org/schema/security
          http://www.springframework.org/schema/security/spring-security-3.0.4.xsd">


        <global-method-security pre-post-annotations="enabled" />   

        <!--  key configuration here is an entry point to be used by security intercepts -->
        <http use-expressions="true"  auto-config="false">

        <session-management session-fixation-protection="none"/>

        <remember-me  token-validity-seconds="1209600"/>

        <!-- Exclude the login page from the security check -->
        <intercept-url pattern="/faces/login.xhtml" access="permitAll"/>

        <!-- All pages requires authentication (not anonymous user) -->
        <intercept-url pattern="/faces/**" access="isAuthenticated()" />

        <intercept-url pattern="/faces/javax.faces.resource/**" filters="none" />
        <intercept-url pattern="/faces/xmlhttp/**" filters="none" />
        <intercept-url pattern="/faces/resources/**" filters="none" />
        <intercept-url pattern="/faces/j_spring_security_check/**" filters="none" />
        <intercept-url pattern="/scripts/**" filters="none" />
        <intercept-url pattern="/images/**" filters="none" />
        <intercept-url pattern="/css/**" filters="none" />  

        <!-- Returns true if the user is not anonymous -->


        <access-denied-handler error-page="/error"/>

        <form-login default-target-url="/users"  
        always-use-default-target="true"            
            login-processing-url="/j_spring_security_check"         
            login-page="/faces/login.xhtml"
            authentication-failure-url="/faces/login.xhtml?login_error=1"                                                               
        />

        <logout logout-url="/logout" logout-success-url="/login" />     
    </http>

    <authentication-manager alias="authenticationManager">          
    <authentication-provider user-service-ref="userDetailsServiceImpl">
    </authentication-provider>
    </authentication-manager>


    </beans:beans>

3 - UserDetailsService:

@Service("userDetailsServiceImpl")
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {
        System.out.println("########## LOADING USER ##################");
        User user = userDao.findUserByEmail(username);
        return new org.springframework.security.core.userdetails.User(
                user.getEmail(), user.getPassword(), true, true, true, true,
                setUserAuthorities(user.getAuthorities()));
    }

    public Collection<GrantedAuthority> setUserAuthorities(List<Authority> auths) {

        List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        for (Authority auth : auths)
            grantedAuthorities.add(new GrantedAuthorityImpl(auth.getName()));
        return grantedAuthorities;
    }
}

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Вы помните, что я говорил, что Spring Security добавляет много фильтров ? Один из этих фильтров отвечает за проверку того, что запрос на j_spring_security_check передается в диспетчер аутентификации.

Но у вас нет этого фильтра.

Если для этого нет причин, включите автоконфигурацию:

<http use-expressions="true"  auto-config="true">

и добавить перехватчик для /j_spring_security_check

<intercept-url pattern="/j_spring_security_check" access="permitAll"/>
1 голос
/ 17 сентября 2015

Поскольку у меня было это

loadUserByUsername не вызывается

и некоторые другие проблемы после обновления безопасности пружины с 3.2.8 до 4.0.2 я оставлю описаниемоей ситуации, даже если там уже принят правильный ответ.

Итак, вчера я решил сделать упомянутое обновление безопасности.Прежде всего, так как в безопасности 4.0.2 защита csrf включена по умолчанию, мне нужно было отключить ее в моем файле security-context.xml:

<http>
   .
   .
   .
   <csrf disabled="true"/>
</http>

На текущем этапе защиты проекта csrf отсутствуетт включены в угловой интерфейс.Этот момент привел к ошибке инициализации контекста.

После этого я увидел, что не могу войти в приложение.Я делал POST по умолчанию j_spring_security_check URL для этого.Но Spring Security 4.0.2 использует другое: Ссылка на Spring Security

login-processing-url Сопоставляется со свойством filterProcessesUrl в UsernamePasswordAuthenticationFilter.Значение по умолчанию: "/login".

Также был изменен URL-адрес выхода по умолчанию: Ссылка безопасности Spring

URL-адрес выхода URL, который приведет к выходу из системы (т. Е. Который будет обработан фильтром).По умолчанию "/logout".

Поэтому я внес изменения в мой файл security-context.xml и логин / выход из системы вернулся к правильному поведению.

После этого я заметил свои аннотации @PreAuthorizeне работают.Я использую их с именами ролей, определенными как константы:

@PreAuthorize("hasRole(T(org...UserService).ADMIN_ROLE_NAME)"
        + " or hasRole(T(org...UserService).OWNER_ROLE_NAME)")

И имена ролей были:

public final static String ADMIN_ROLE_NAME = "admin";
public final static String USER_ROLE_NAME = "plain_user";
public final static String OWNER_ROLE_NAME = "company_owner";

Как вы видите, они не содержат префикса 'ROLE_'.Насколько я понимаю, Security 4.0.2 не может использовать такие имена.Может быть, это из-за: Ссылка Spring Security

Теперь вы можете опционально опустить префикс ROLE_.Мы делаем это, чтобы удалить дублирование.В частности, поскольку выражение hasRole уже определяет значение как роль, оно автоматически добавляет префикс, если его там нет.

Я изменил имена ролей на:

public final static String ADMIN_ROLE_NAME = "ROLE_ADMIN";
public final static String USER_ROLE_NAME = "ROLE_USER";
public final static String OWNER_ROLE_NAME = "ROLE_OWNER";

и безопасностьвернулся к правильному поведению.

PS (после ответа Ральфа) * ​​1057 *

и добавьте перехватчик для / j_spring_security_check

У меня не было перехватчика для 3.2.8 по умолчанию login-processing-url.И у меня нет перехватчика для 4.0.2 по умолчанию login-processing-url.В моем файле security-context.xml есть перехватчик для страницы входа в систему:

<intercept-url pattern="/authorize" access="permitAll" />

, который просто возвращает login.html.

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