Привет!  Сразу к делу - не работает авторизация, если указывать свой 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; }
|
Поможите... 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
|