web-dev-qa-db-ja.com

Spring MVCコントローラーのセキュリティコンテキストからUserDetailsオブジェクトを取得する

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;
    }   
65
danny.lesnik

ユーザーがログインしていることが確実にわかっている場合(例では/index.htmlは保護されています):

UserDetails userDetails =
 (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

ユーザーがログインしているかどうかを最初に確認するには、現在のAuthenticationAnonymousAuthenticationTokenではないことを確認します。

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
        // userDetails = auth.getPrincipal()
}
114
sourcedelica

Spring 3の注入でこれを処理してください。

tsunade21 のおかげで、最も簡単な方法は次のとおりです。

 @RequestMapping(method = RequestMethod.GET)   
 public ModelAndView anyMethodNameGoesHere(Principal principal) {
        final String loggedInUserName = principal.getName();

 }
31
Farm

ページにユーザー名を印刷したいだけなら、このソリューションがいいかもしれません。オブジェクトのキャストから解放され、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メソッドを使用してユーザー情報を取得できます。

4
L'sync

あなたが春のセキュリティを使用している場合、現在のログインユーザーを取得することができます

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
     String name = auth.getName(); //get logged in username
1
amit

それは別のソリューションです(Spring Security 3):

public String getLoggedUser() throws Exception {
    String name = SecurityContextHolder.getContext().getAuthentication().getName();
    return (!name.equals("anonymousUser")) ? name : null;
}
1