5

アプリケーションに現在ログインしているすべてのユーザーのリストを取得したいと考えています。SessionRegistryメソッドを呼び出すためにコードに挿入する必要があることはわかっていますgetAllPrincipals()。残念ながら、私はいつも空のリストを取得します。人口が少ないようでSessionRegistry、作り方がわかりません。StackOverflowにも同様の質問があることは知っていますが、問題の解決にはまだ問題があります。まず、web.xml に次のコードを追加します。

<listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

私が知っているように、セッションのライフサイクル (作成、破棄) に関する情報を取得できます。それだけです。前進するのに大きな問題があります。セキュリティ Bean を含む私のファイルを以下に示します。

<beans:bean id="successAuth" class="pl.fp.microblog.auth.SuccessAuth"/>
<beans:bean id="failureAuth" class="pl.fp.microblog.auth.FailureAuth"/>

<http auto-config="true">
    <intercept-url pattern="/" access="ROLE_USER" />
    <intercept-url pattern="/profile/*" access="ROLE_USER" />
    <form-login 
        login-page="/login"         
        authentication-success-handler-ref="successAuth"
        authentication-failure-handler-ref="failureAuth"
        username-parameter="username"
        password-parameter="password"           
        login-processing-url="/login_processing_url"
    />          
    <security:logout logout-url="/logout_processing_url"/>  
    <session-management>
        <concurrency-control max-sessions="1" session-registry-alias="sessionRegistry"/>
    </session-management>
</http>

<beans:bean id="saltProvider" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
    <beans:property name="userPropertyToUse" value="username"></beans:property>
</beans:bean>

<beans:bean id="userService" class="pl.fp.microblog.auth.UserService">
    <beans:property name="userDAO" ref="userDAO"/>
</beans:bean>

<authentication-manager>
    <security:authentication-provider user-service-ref="userService">
        <password-encoder hash="sha-256">
            <security:salt-source ref="saltProvider"/>
        </password-encoder>         
    </security:authentication-provider>
</authentication-manager>

ここで getAllPrinciples() メソッドを呼び出します。

@Transactional
@Controller
public class SiteController {
    @Autowired
    private UserDAO userDAO;
    @Autowired
    private SessionRegistry sessionRegistry;    

    @RequestMapping(value = "profile/{login}")  
    public String profilePage(@PathVariable String login, HttpServletRequest req) throws SQLException {     
        ...
        sessionRegistry.getAllPrincipals().size()
        ...     
        return "profile";               
    }
}

session-managemenentなどにコードを追加しようとしましたがhttpConcurrentSessionFilter実際には理解できません。そして、ドキュメンテーションは私には複雑すぎます。誰かが私を助けて、次に何をすべきかを段階的に教えてくれますか? どの豆を追加する必要がありますか?

4

1 に答える 1

6

私はあなたがほとんどそこにいると思います。おそらく見逃しているのは、 の使用だけですsession-registry-alias。要素でその属性を使用することによりconcurrency-control、セッション レジストリを公開して、独自の Bean に注入できるようにします。参照ドキュメントを参照してください。

したがって、必要なものは次のとおりです。

<http auto-config="true">
...
    <session-management>
        <concurrency-control max-sessions="1" session-registry-alias="sessionRegistry"/>
    </session-management>
</http>

ConcurrentSessionControlStrategyこれで、上記の構成によって暗黙的に設定された によって設定されるセッション レジストリへの参照ができました。それを使用するには、通常どおり Bean に注入するだけです。

<bean class="YourOwnSessionRegistryAwareBean">
    <property sessionRegistry="sessionRegistry"/>
</bean>

上記の構成は、ユーザーが持つことができる同時セッションの数も制限することに注意してください。この制限が必要ない場合は、名前空間スキーマでmax-sessions属性を -1 に設定できないため、名前空間構成の利便性を放棄する必要があります。必要な Bean を手動で接続する方法についてヘルプが必要な場合は、参照ドキュメントに詳細な手順が記載されています。

于 2013-01-12T21:59:56.027 に答える