2017-01-26 12 views
0

私のSpring MVCウェブアプリケーションでは、ログインとログアウトにSpring Securityを使用します。私は、次のしている私のspring-security.xmlでは次のようにSpring Security:ログアウト時にセッションからデータを取得する

<form-login login-page="/login" default-target-url="/" 
      authentication-failure-url="/login?error" username-parameter="username" 
      password-parameter="password" /> 
     <logout logout-success-url="/login?logout" /> 

をログイン時には、私はセッションにユーザの詳細とTOを設定しています:

userTOはタイプ UserTOのユーザの詳細を持つオブジェクトです
request.getSession().setAttribute("USERTO", userTO); 

。以下のように、私のログアウトコントローラのメソッドは次のとおりです。

@RequestMapping(value = "/login", method = RequestMethod.GET) 
     public String login(ModelMap model, @RequestParam(value = "error", required = false) String error, @RequestParam(value = "logout", required = false) String logout) 
     { 
      try 
      { 
       UserTO user = (UserTO) httpSession.getAttribute("USERTO"); 
       if (error != null) 
        { 
         //error during login 
        } 
       if (logout != null) 
        { 
         //succesful logout 
        } 
       model.addAttribute("smartWCMLayoutID", "smartly"); 
       model.addAttribute("cm", new CommonModel("", "", "")); 
       return "smartwcm.login.definition"; 
      } 
      catch(Exception ex) 
      { 

      } 
     } 

しかし、ログアウト時に、私は常にnullをUserTOを取得します。ログアウトする前にセッションからそのvallueをキャプチャする方法はありますか?

答えて

0

私は直接答えませんが、別のアプローチを示します。私はいつも私の春、セキュリティプロジェクトに次のクラスを添付:

public class LoggedUserUtils { 
    public static User getLoggedUser() { 
     final Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
     final Object principal = auth.getPrincipal(); 

     if (principal instanceof User) { 
      return (User) principal; 
     } 
     return null; 
    } 
} 

それはあなたがUserDetailsが保存されていているSecurityContextを使用しています。私はいつもインターフェイスをUserクラスに実装しています。

すべてのコントローラ、サービス、またはリポジトリで上記の静的メソッドを使用できます(ただし、サービスレイヤのみが適切で、最終的にコントローラも同様です)。認証されていない安全でないエンドポイント経由で入力されたコールの場合は、nullが返されます。

関連する問題