【发布时间】:2014-03-24 10:02:49
【问题描述】:
我很惊讶我发现在这个主题上的搜索很少。我正在使用 Spring Security 来允许用户登录 Spring MVC 应用程序。我还在服务层中使用 Hibernate 来持久保存对数据库的更改(我将用户信息保存在用于应用程序其余部分的同一数据库中)。在这种环境下(利用 Spring Security 的优势),我怎样才能让用户更改自己的密码?
这是我的spring-security.xml:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/essays/auth/login" access="permitAll"/>
<intercept-url pattern="/essays/auth/logout" access="permitAll"/>
<intercept-url pattern="/essays/auth/denied" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/" access="hasRole('ROLE_USER')"/>
/* more intercept urls */
<form-login login-page="/essays/auth/login"
authentication-failure-url="/essays/auth/login?error=true"
default-target-url="/essays/main/student/search"
always-use-default-target="true"/>
<access-denied-handler error-page="/essays/auth/denied"/>
<logout invalidate-session="true"
logout-success-url="/essays/auth/login"
logout-url="/essays/auth/logout"/>
</http>
<authentication-manager>
<authentication-provider user-service-ref="customUserDetailsService">
<password-encoder hash="md5"/>
</authentication-provider>
</authentication-manager>
我实现了自定义用户详细信息服务:
@Service
@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {
@Resource
private UserService userService;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
try {
org.jana.domain.User domainUser = userService.getByUsername(username);
boolean enabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
return new User(
domainUser.getUsername(),
domainUser.getPassword().toLowerCase(),
enabled,
accountNonExpired,
credentialsNonExpired,
accountNonLocked,
getAuthorities(domainUser.getRole().getRole()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
...
这是处理 Hibernate 的服务:
@Service("userService")
@Transactional
public class UserService {
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;
public User getByUsername(String username) {
Session session = sessionFactory.getCurrentSession();
String hql = "FROM User u WHERE u.username = :username";
Query query = session.createQuery(hql);
query.setParameter("username", username);
User user = (User)query.uniqueResult();
return user;
}
我是新来的,所以任何帮助都将不胜感激。谢谢。
【问题讨论】:
-
通过更改任何其他属性(例如电子邮件)来更改密码(通常)并没有什么特别之处。 Spring Security 的目标是身份验证和授权。这只是一个数据库更新。
-
所以 Spring Security 中没有任何功能可以让这个自动化/更容易?
-
没有我知道的功能。
-
Spring security 不知道你的域对象..
标签: hibernate spring-mvc spring-security change-password