问题描述
我有一个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());
<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();
}