Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring Security + Salt на основе id, Не работает авторизация 
:(
    Опции темы
soleg
Дата 28.6.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.6.2011
Где: Минск

Репутация: нет
Всего: нет



Привет! smile Сразу к делу - не работает авторизация, если указывать свой salt при шифровании пароля. 

То есть, <beans:property name="userPropertyToUse" value="username"/> - то все пучком, если назначить к примеру id, то не пускает (естественно создав нового пользователя). 

Может подскажите куда копать???  Или в чем заблуждаюсь (т.к. по сути менял класс "UserAccount implements UserDetails") Пол дня убил (пробовал по разному).

Конфиги такие: 
applicationContext-security.xml
Код

<?xml version="1.0" encoding="UTF-8"?>

<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.0.xsd
             http://www.springframework.org/schema/security
             http://www.springframework.org/schema/security/spring-security-3.0.4.xsd
">

    <beans:import resource="applicationContext.xml"/>
    <global-method-security secured-annotations="enabled" jsr250-annotations="enabled"
                            pre-post-annotations="enabled"/>

    <http auto-config="true"
          access-denied-page="/views/auth/access_denied.xhtml">

        <intercept-url pattern="/views/auth/login*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <intercept-url pattern="/views/admin/*" access="ROLE_ADMIN"/>
        <intercept-url pattern="/views/accounts/*" access="ROLE_CUSTOMER, ROLE_ADMIN"/>
        <intercept-url pattern="/**" access="ROLE_CUSTOMER, ROLE_ADMIN, IS_AUTHENTICATED_ANONYMOUSLY"/>

        <form-login
            login-processing-url="/j_spring_security_check"
            login-page="/views/auth/login.xhtml"
            authentication-failure-url="/views/auth/login.xhtml"/>

        <logout
            invalidate-session="true"
            logout-success-url="/"
            logout-url="/j_spring_security_logout"/>
    </http>

    <beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
        <beans:constructor-arg value="256"/>
    </beans:bean>

    <beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
       <beans:property name="userPropertyToUse" value="id"/>  // тут было value="username", и все работало
    </beans:bean>

    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userDetailsService">
            <password-encoder ref="passwordEncoder">
                <salt-source ref="saltSource"/>
            </password-encoder>
        </authentication-provider>
    </authentication-manager>

    <!-- Authorization beans -->
    <beans:bean id="userDetailsService" class="com.thelightideas.elladatour.web.auth.service.UserDetailsServiceImpl">
        <beans:property name="userService" ref="userService"/>
    </beans:bean>

    <beans:bean id="loggerListener" class="org.springframework.security.authentication.event.LoggerListener"/>

</beans:beans>


UserDetails.class - добавил поле id и get к нему
Код

@SuppressWarnings("serial")
public class UserAccount implements UserDetails {
    private User user;
    private final Long id; //поле id

    public UserAccount() {
        this(new User());
    }

    public UserAccount(final User user) {
        super();
        this.user = user;
        this.id = user.getId(); //получаем id_шник
    }

    @Override
    public Collection<GrantedAuthority> getAuthorities() {
        UserRole userRole = user.getRole();

        Collection<GrantedAuthority> result = new ArrayList<GrantedAuthority>();
        if (userRole != null) {
            result.add(new UserAuthority(userRole));
        }
        return result;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getEmail() {
        return this.user.getEmail();
    }

    public void setEmail(String email) {
        this.user.setEmail(email);
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    public void setPassword(String password) {
        this.user.setPassword(password);
    }

    @Override
    public String getUsername() {
        return user.getLogin();
    }

    public void setUsername(String username) {
        this.user.setLogin(username);
    }
    
    //геттер 
    public Long getId() {
        return id;
    }
}

Также в сущности User, есть getId/setId и пробовал через них:

Код

public Long getId() {
        return user.getId();
}

public void setId(Long id) {
        this.user.setId(id);
}


При регистрации ничего не поменялось:

Код

@Transactional
public String registerAccount() {
...
        account.getUser().setPassword(passwordEncoder.encodePassword(
            newPassword,
            saltSource.getSalt(account))
        );

        userService.save(account.getUser());
...
}


Метод doLogin, тоже не изменен:
Код

public String doLogin() throws IOException, ServletException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        RequestDispatcher dispatcher = ((ServletRequest) context.getRequest())
            .getRequestDispatcher("/j_spring_security_check");
        dispatcher.forward((ServletRequest) context.getRequest(), (ServletResponse) context.getResponse());
        FacesContext.getCurrentInstance().responseComplete();

        // It's OK to return null here because Faces is just going to exit.
        return null;
}


Поможите... smile 

P.S. Вообще по хорошему использовать id как соль не очень хорошо, лучше добавить в сущность хибернейта еще поле. Но суть не меняется, все что кроме username - не пашет. А login (username) - уже по требованиям, может изменятся (пользователь имеет права менять свой логин), и как соль уже не катит.

И напоследок, мой web.xml
Код

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml,
            /WEB-INF/applicationContext-security.xml,
            classpath:/business-context.xml,
            classpath:/persistence-context.xml
        </param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>
            /WEB-INF/faces-config.xml,
            /WEB-INF/faces-managed-beans.xml,
            /WEB-INF/faces-navigation.xml
        </param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>

    <context-param>
        <param-name>org.richfaces.SKIN</param-name>
        <param-value>classic</param-value>
    </context-param>

    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>
        <param-value>enable</param-value>
    </context-param>

    <context-param>
        <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
        <param-value>com.sun.facelets.FaceletViewHandler</param-value>
    </context-param>

    <context-param>
        <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
        <param-value>false</param-value>
    </context-param>

    <context-param>
        <param-name>org.ajax4jsf.RESOURCE_URI_PREFIX</param-name>
        <param-value>a4j_resource/</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
        <param-value>true</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</param-name>
        <param-value>true</param-value>
    </context-param>

    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>richfaces</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
        <init-param>
            <param-name>createTempFiles</param-name>
            <param-value>false</param-value>
        </init-param>
        <!-- Ограничение максимального размера файлов для upload -->
        <init-param>
            <param-name>maxRequestSize</param-name>
            <param-value>512000</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>richfaces</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

    <filter>
        <display-name>Hibernate Filter</display-name>
        <filter-name>sessionFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>sessionFilter</filter-name>
        <url-pattern>*.xhtml</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.util.IntrospectorCleanupListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>

    <!-- location of the tag library -->
    <context-param>
        <param-name>facelets.LIBRARIES</param-name>
        <param-value>/WEB-INF/context.taglib.xml;</param-value>
    </context-param>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!--Error pages-->
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/views/errors/main_error.xhtml</location>
    </error-page>

</web-app>



Это сообщение отредактировал(а) soleg - 28.6.2011, 14:10
PM MAIL   Вверх
MisterCleric
Дата 29.6.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет.
1. Какой Exception вылазит?
2. В debug не пробовал посмотреть, что же все-таки приходит в org.springframework.security.authentication.dao.ReflectionSaltSource#findSaltMethod ?



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
soleg
Дата 29.6.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 28.6.2011
Где: Минск

Репутация: нет
Всего: нет



Разобрался сам smile

До сохранения в базе id не присвоен, проблема была в этом.
Подробнее тут

Цитата

При регистрации ничего не поменялось:

... вот тут!!!
Код

account.setUser(userService.save(account.getUser())); //сохраняем

Object salt = saltSource.getSalt(account);
String password = passwordEncoder.encodePassword(newPassword, salt);
account.getUser().setPassword(password);

userService.save(account.getUser()); //сохраняем заново пред. сущность


Главное, изначально установить после сохранения эту же сущность в account.setUser(сохранение).

Вообще все логично, но пока не столкнулся, и не задумываешься.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1281 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.