当前位置: 首页 > 知识库问答 >
问题:

Spring Security-从数据库获取当前用户字段

壤驷升
2023-03-14
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控制器中获得当前用户平衡?

共有1个答案

王俊哲
2023-03-14

您在Spring Security配置中定义的JDBC服务将仅使用user-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;
    }
}

创建authenticationproviderbean并提供您的自定义用户服务作为其属性。

<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 Security guides。

 类似资料:
  • 我的数据库中有一个表,其中包含以下信息: Nom=name。Prénom=firstname。 我正在尝试,一旦用户登录,检索整个用户的字段,除了:密码。 例如, 如果我在日志页面上键入用户名和密码,我想检索: 我的名字 我的名字 我的邮箱 我的用户名 还有, 我已经知道如何简单地检索用户名,但是我一直无法获取整个用户字段。。 这是我的文件, 用户实体 AuthUser详情|自定义用户详情 Aut

  • 我有一个辅助项目网站,人们可以在那里评论东西,现在我需要显示用户的评论和评论者的用户名。问题是,我无法获得登录用户的用户名。 评论示例: 1) 评论人-Shelo 测试评论 2) 评论人-ProGa 测试评论2 现在的问题是,如果我试图获取“当前登录”用户的用户名,当用户登录时,两条评论都会有相同的用户名 上面的代码示例是您当前登录用户的方式。因此,如果我使用这段代码,并尝试通过

  • 本文向大家介绍如何获取当前数据库版本?相关面试题,主要包含被问及如何获取当前数据库版本?时的应答技巧和注意事项,需要的朋友参考一下 使用 select version() 获取当前 MySQL 数据库版本。

  • 我的问题很简单。我正在建立一个简单的页面,我需要从moodle数据库中访问一些数据,比如当前记录的用户ID,他的消息,谁发送的... 该页位于本地。 Moodle托管在其他地方,但我拥有数据库所需的所有信息(用户和密码)。 我想做的是,通过cookies或其他东西,获取登录moodle的当前用户的消息。 我在一些地方读到,我可以只包含config.php,然后获得,但我希望使用cookie会话。

  • //MySQL,,mysql -v select version(); //Oracle select * from v$version;