Spring Security 3とSpring MVC 3.05を使用しています。
現在ログインしているユーザーのユーザー名を印刷したいのですが、どのようにしてコントローラーでUserDetailsを取得できますか?
@RequestMapping(value="/index.html", method=RequestMethod.GET)
public ModelAndView indexView(){
UserDetails user = ?
mv.addObject("username", user.getUsername());
ModelAndView mv = new ModelAndView("index");
return mv;
}
ユーザーがログインしていることが確実にわかっている場合(例では/index.html
は保護されています):
UserDetails userDetails =
(UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
ユーザーがログインしているかどうかを最初に確認するには、現在のAuthentication
がAnonymousAuthenticationToken
ではないことを確認します。
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
// userDetails = auth.getPrincipal()
}
Spring 3の注入でこれを処理してください。
tsunade21 のおかげで、最も簡単な方法は次のとおりです。
@RequestMapping(method = RequestMethod.GET)
public ModelAndView anyMethodNameGoesHere(Principal principal) {
final String loggedInUserName = principal.getName();
}
ページにユーザー名を印刷したいだけなら、このソリューションがいいかもしれません。オブジェクトのキャストから解放され、Spring Securityなしでも機能します。
@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public ModelAndView indexView(HttpServletRequest request) {
ModelAndView mv = new ModelAndView("index");
String userName = "not logged in"; // Any default user name
Principal principal = request.getUserPrincipal();
if (principal != null) {
userName = principal.getName();
}
mv.addObject("username", userName);
// By adding a little code (same way) you can check if user has any
// roles you need, for example:
boolean fAdmin = request.isUserInRole("ROLE_ADMIN");
mv.addObject("isAdmin", fAdmin);
return mv;
}
注 "HttpServletRequest request"パラメータが追加されました。
SpringはHttpServletRequest、Principalなどの独自のオブジェクト(ラッパー)を注入するため、正常に機能します。したがって、標準のJavaメソッドを使用してユーザー情報を取得できます。
あなたが春のセキュリティを使用している場合、現在のログインユーザーを取得することができます
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String name = auth.getName(); //get logged in username
それは別のソリューションです(Spring Security 3):
public String getLoggedUser() throws Exception {
String name = SecurityContextHolder.getContext().getAuthentication().getName();
return (!name.equals("anonymousUser")) ? name : null;
}