Spring基本身份验证后,Facelet上的getUserName

时间:2014-01-07 07:36:29

标签: spring jsf

您好我可以使用下面的代码获取我的bean的用户详细信息。但我无法在我的页面上获取用户名。

 @Controller
 @SessionScoped
 public class HomeController extends SimpleUrlAuthenticationSuccessHandler  {
 @Override
 public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException {

UserDetails user = (UserDetails)auth.getPrincipal();
System.out.println("user::::"+user.getUsername());
  request.getSession().setAttribute("user",user.getUsername());

  setDefaultTargetUrl("/Home");


  super.onAuthenticationSuccess(request, response, auth);}}

我能够重定向,现在在另一个控制器中我尝试通过

获取此userName
FacesContext facesCntxt = FacesContext.getCurrentInstance();
Map sessionMap = facesCntxt.getExternalContext().getSessionMap();
        String userName = (String)sessionMap.get("user");

直到现在它工作正常..但是当我尝试在我的facelet中使用#{param ['user']}来获取此详细信息时,它不会返回任何值。

我犯的错是什么?

1 个答案:

答案 0 :(得分:0)

您的代码有点令人困惑,您的AuthenticationSuccessHandler@Controller并使用JSF(或CDI)@SessionScoped?这是什么?

@Controller是Spring MVC中使用的特定构造型@Component注释,AuthenticationSuccessHandler是Spring Security接口而不是Spring MVC Controller。所以我期望一个@Component(或者只是用你的Spring Security配置在XML中注册它)。

@SessionScoped在Spring上下文中没有做任何事情(除非你已经编写了扩展名)。所以你应该删除它。

如果您已正确配置Spring Security,只需使用HttpServletRequest方法获取Principal即可从getUserPrincipal获取用户名。有关如何执行此操作,请参阅How to print principal using JSF 2.0 + Facelets?。 (所以不需要自己破解,只需使用标准)。