2011-03-30 14 views
0

私はspring mvc、spring security、hibernateを使ってWebアプリケーションを開発しています。セッション中のオブジェクトを自動的に設定する

ユーザー資格情報とのセッションでオブジェクトを自動的に設定する方法はありますか?私が意味する、私は手動でセッションにユーザーオブジェクトを設定している現在のコードがあります。

@RequestMapping(value = { "/privados/procesarLogin", 
     "/sesiones/procesarLogin" }, method = RequestMethod.GET) 
public ModelAndView procesarLogin(HttpServletRequest req) { 
    ModelAndView mav = new ModelAndView(); 
    String usuario = (String) SecurityContextHolder.getContext() 
      .getAuthentication().getCredentials(); 
    Usuario usuarioSesion = us.retornarUsuario(usuario); 
    HttpSession sesion = req.getSession(true); 
    sesion.setAttribute("usuarioSesion", usuarioSesion); 
    mav.setViewName("/privados/principal"); 
    return mav; 
} 

を私はユーザーオブジェクトを作成し、彼のログインが正常に認証された後に自動的にセッションにそれを設定するために獲得しました。 xmlファイルをどのように設定する必要がありますか?私の現在の1は次のようになります。

//ヘッダ

<global-method-security secured-annotations="enabled" /> 

<http auto-config="true" access-denied-page="/app/sesiones/procesarLogin"> 

    <logout logout-success-url="/app/sesiones/login" /> 
    <form-login authentication-failure-url="/app/sesiones/login?error=true" 
     login-page="/app/sesiones/login" default-target-url="/app/sesiones/procesarLogin" /> 
    <intercept-url pattern="/app/privados/*" access="ROLE_USER" /> 
</http> 

<authentication-manager> 
    <authentication-provider> 
     <jdbc-user-service data-source-ref="dataSource" 
      users-by-username-query="Select usuario, contrasena,true from Usuarios where usuario=?" 
      authorities-by-username-query="Select usuario, role from Usuarios where usuario=?" /> 
     <password-encoder ref="passwordEncoder" /> 
    </authentication-provider> 
</authentication-manager> 

<beans:bean id="jasyptPasswordEncryptor" 
    class="org.jasypt.util.password.BasicPasswordEncryptor" /> 

<beans:bean id="passwordEncoder" class="org.jasypt.spring.security3.PasswordEncoder"> 
    <beans:property name="passwordEncryptor"> 
     <beans:ref bean="jasyptPasswordEncryptor" /> 
    </beans:property> 
</beans:bean> 

私は事前に おかげであなたの助けを願っています!

+0

私はあなたの質問に答えることはできませんが、先日春のAPIを見ていて、DefaultSessionAttributeStoreを見つけました。それはあなたが設定し、コントローラのセッションから特定の属性を削除することができます:public ModelAndView procesarLogin(DefaultSessionAttributeStore status、WebRequest request){... status.storeAttribute(request、attributeName、attributeValue); status.cleanupAttribute(request、attributeName);} – blong824

答えて

0

scope = sessionを使用してBeanを作成すると、セッションの作成時にBeanをインスタンス化できます。 3.4 Bean Scopesを参照してください。

これが役に立ちます。あなたは、コントローラ(または他のコントローラ内)の他の方法でそれを再利用したいので、あなたがセッションでUsuarioオブジェクトを入れている場合は

0

、その後、より良いときれいな方法は、以下のような方法自体にそれを注入するようになります。

@RequestMapping(value = { "/privados/procesarLogin", 
    "/sesiones/procesarLogin" }, method = RequestMethod.GET) 
public ModelAndView procesarLogin(HttpServletRequest req, Usuario usuario) { 
/* Use usuario */ 
... 
} 

これを行うには、WebArgumentResolverを実装し、AnnotationMethodHandlerAdapterで登録する必要があります。既存のコードをWebArgumentResolver実装のresolveArgumentメソッドに転送します。つまり、最初にセッション中にusuarioをチェックします。それ以外の場合は、SecurityContextHolderからビルドしてください。

0

また、Springは、リクエストごとに自動的に実行され、1回だけプログラムされるHandlerInterceptorsを提供します。サーブレットフィルタのようなものですが、インターセプタはリクエストの処理前後でやり取りできます。

関連する問題