如何解决Spring Security Principal无法与@PostConstruct一起使用
我有一个Managedbean,其中包含此函数,该函数返回登录用户的用户名:
public String getConnectedUser( ){
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
if (authentication == null)
return null;
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
return ((UserDetails) principal).getUsername();
} else {
return principal.toString();
}
我想使用从Spring Security获得的用户名将用户与我的DAO一起使用。 当我在@PostConstruct方法中调用它时,它不会返回任何内容。
@PostConstruct
public void init() {
user = utilisateurService.getUtilisateurByLogin( getConnectedUser());
但是当我在JSF中调用它时,它显示了正确的登录用户名:
<h:outputText
value="Logged as : #{testMB.getConnectedUser()}" />
最后:使用Init函数,视图中什么也看不到,通过JSF调用,我获得了用户名,有人可以帮我吗?
编辑:我运行了一些测试,并且即使我已经登录,认证也似乎为空
解决方法
我认为Spring Security主体在PostConstruct中不可用是有道理的。
在应用程序启动时,将在DAO上调用PostConstruct。那时,将没有登录用户。但是,当您浏览JSF页面时,您可能已经登录了,这就是为什么Principal在那里可用的原因。
当您访问应用程序URL时,将调用Spring Security筛选器链。
我建议您在常规DAO方法调用期间调用此方法。如果您已登录,则“主体”应该可用。
@Repository
public class SomeDao
{
public String someDaoMethod() {
getConnectedUser();
....
}
private String getConnectedUser( ){
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
if (authentication == null)
return null;
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
return ((UserDetails) principal).getUsername();
} else {
return principal.toString();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。