我的数据库中有一个包含用户信息的表。
CREATE TABLE users
(
id_user serial NOT NULL,
phone text,
password text,
balance numeric,
email text,
CONSTRAINT users_pkey PRIMARY KEY (id_user),
CONSTRAINT users_login_key UNIQUE (phone)
)
我使用Spring Security。部分配置:
<security:jdbc-user-service id="userService"
data-source-ref="dataSource"
users-by-username-query="select phone, password, true from users where phone=?"
authorities-by-username-query="select phone,'ROLE_USER' from users where phone=?" />
如何在Spring MVC Controller中获得当前用户平衡?
答案 0 :(得分:3)
您在Spring Security配置中定义的JDBC service将仅使用users-by-username-query
查询和用户名的权限使用authorities-by-username-query
查询来获取用户名,密码和启用状态。这意味着任何额外的属性都不会映射到用户主体对象,该对象将被创建以填充安全性上下文。
获取用户所有信息的一种方法是创建UserDetailsService
的自定义实现,该实现将能够检索包括其所有自定义属性的用户数据。以下是此方法的示例(假设您正在为数据层使用JPA / Hibernate):
@Entity
@Table(name="users")
public class User implements UserDetails {
private BigDecimal balance;
// Other properties omitted ...
// Getters and setters omitted ...
// Implementation of UserDetails methods omitted ...
}
负责加载用户信息的服务。请注意,在现实世界中,您可能应该有单独的DAO查询用户,针对接口的程序等。此示例有意保持尽可能短。
@Service
public class UserService implements UserDetailsService {
@Autowired
private SessionFactory sessionFactory;
@Override
public User loadUserByUsername(String username) throws UsernameNotFoundException {
Query query = sessionFactory.getCurrentSession().createQuery("FROM User u WHERE u.username = :username");
query.setParameter("username", username);
User user = (User) query.uniqueResult();
if (user == null) {
throw new UsernameNotFoundException("User with username '" + username + "' does not exist.");
}
return user;
}
}
创建AuthenticationProvider
bean并提供自定义用户服务作为其属性。
<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userService" />
<!-- Other required properties ... -->
</bean>
您可以使用以下方法访问控制器中的当前用户及其属性:
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
BigDecimal balance = user.getBalance();
作为最后的评论,请注意,这不是100%正常工作的复制和粘贴解决方案,而是演示您可以采取的方法来实现所需的结果。我建议查看核心类/接口的文档,例如AuthenticationProvider
,UserDetailsService
,UserDetails
和Spring安全指南,以获取更多详细信息。