【发布时间】:2014-04-15 12:45:26
【问题描述】:
我是 Spring Security 的新手,并且遵循了一些基本的方法来让 Spring Security 在我的应用程序中工作,但现在我想看看是否有办法让我自己的 User 对象在登录时添加到 Spring 的 SecurityContext /身份验证。
我的安全当前配置为使用 JdbcDaoImpl:
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="com.ia.security.SpringSecurityDao" />
</authentication-manager>
<beans:bean id="com.ia.security.SpringSecurityDao" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<beans:property name="usersByUsernameQuery">
<beans:value>select username,password,enabled
from user
where username = ?
</beans:value>
</beans:property>
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="enableGroups" value="true" />
<beans:property name="enableAuthorities" value="false" />
<beans:property name="groupAuthoritiesByUsernameQuery">
<beans:value>SELECT R.ID, R.NAME, P.NAME
FROM ROLE R
JOIN USER_ROLE UR on R.id = UR.role_id
JOIN USER U on U.id = UR.user_id
JOIN ROLE_PERMISSION RP ON RP.role_id = R.id
JOIN PERMISSION P ON P.id = RP.permission_id
WHERE U.username=?
</beans:value>
</beans:property>
</beans:bean>
我意识到我可以从 SecurityContext 中检索 Principal 对象并获取用户名并根据用户名重新查询数据库,但我认为将整个 User 对象简单地存储在 SecurityContext 中会更容易当我在整个应用程序中需要它时,可以轻松访问它,而不仅仅是将用户名、密码和启用的字段存储在 UserDetails 对象中。
我查看了 UserDetailsService,更具体地说是 JdbcDaoImpl 类,但不完全确定最好的方法。如果我只是通过调用super.loadUserByUsername 来覆盖/扩展loadUserByUsername 方法来返回我自己的UserDetails 对象就足够了吗?那我能不能做到SecurityContextHolder.getContext().getAuthentication().getDetails() 并将其转换为我自己的对象?
我在 StackOverflow 上找到了与此相关的其他帖子,但大多数似乎都忽略了与从数据库中检索到的权限和角色有关的任何内容,所以我不确定这是否是最好的方法.
【问题讨论】:
标签: java spring spring-security