2014-03-28 5 views
3

Shiro는 캐시 기능을 제공하지만 필자는 사용자를 위해 동적 역할 및 권한을 사용하고 있습니다. 특정 사용자에 대한 캐시를 만료 시켜서 권한 변경이 사용자에게 즉시 영향을 미치도록해야합니다.Shiro의 제목 캐시를 지우는 방법

영역에는 메소드가 있지만, 캐시를 지우는 메소드를 호출하는 관련 영역의 인스턴스를 얻는 방법.

답변

1

AuthoringRealm에서 getAuthorizationInfo 메소드의 소스를 체크 아웃하면 키/값 저장소를 사용하여 인증 정보를 캐시하는 것만 알 수 있습니다.

PrincipalCollection 개체를 키로 사용합니다. 캐시는 일반적으로 취소해야

realm.getAuthorizationCache().remove(SecurityUtils.getSubject().getPrincipals()) 

:

그래서 당신이 뭔가처럼 호출하는 경우.

6

필자는 AuthoringRealm의 확장 영역에서 개인 메소드 "clearCachedAuthorizationInfo"를 공개했습니다. 그런 다음 교장을 전달하십시오.

public class MyRealm extends AuthorizingRealm { 
    //... 
    @Override 
    public void clearCachedAuthorizationInfo(PrincipalCollection principals) 
    { 
     super.clearCachedAuthorizationInfo(principals); 
    } 
    //... 
} 

권한 부여 캐시를 지우려면 :이 조금 청소기/생각

realm.clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals()); 

을 안전이 메소드는 캐시에 null에 대한 추가 검사가 있고 캐시에 대한 참조를 얻을 수 있도록하기 때문에 만약 존재한다면. 단순히 getAuthorizationCache()으로 전화를 걸면이 작업이 수행되지 않으며 항상 작동하지 않을 수도 있습니다.

영역에 대한 참조를 유지해야합니다. Shiro를 Spring을 통해 초기화 한 다음 필요에 따라 Singleton Bean으로 주입하여이 작업을 수행했습니다.

+0

안녕하세요. 응답 해 주셔서 감사합니다. 하지만 나는 봄을 사용하지 않습니다. 그래서 나는 shiro가 사용하는 realm 인스턴스를 얻는 방법을 INI를 사용하여 shiro를 구성해야합니다. shiro를 java 코드를 통해 구성하려고 시도했지만 Java 코드 구성이 작동하지 않아 아무 영역도 구성되어 있지 않습니다. –

+1

사용할 수있는 모든 영역을 가져 오려면 다음을 사용할 수 있습니다. 콜렉션 영역 = ((RealmSecurityManager) SecurityUtils.getSecurityManager()). getRealms(); 그런 다음 노출 된 메소드가 권한 정보를 지우고 해당 영역에서 호출하는 영역을 볼 수 있습니다. –