Spring Security - 从数据库

时间:2015-05-10 13:52:08

标签: java spring spring-mvc spring-security

我的数据库中有一个包含用户信息的表。

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中获得当前用户平衡?

1 个答案:

答案 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 ...
}

UserService

负责加载用户信息的服务。请注意,在现实世界中,您可能应该有单独的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%正常工作的复制和粘贴解决方案,而是演示您可以采取的方法来实现所需的结果。我建议查看核心类/接口的文档,例如AuthenticationProviderUserDetailsServiceUserDetails和Spring安全指南,以获取更多详细信息。