문제

비누 앱에서 자신의 역할을 가진 사용자의 전체 모델에 액세스하고 싶습니다. 예를 들어, "Fred"라는 사용자의 역할을 알고 싶을 수도 있습니다.

어떻게 일종의 글로벌 JAAS 레지스트리에 도달하고 (pseudocode) GlobalRegistry.getUser ( "Fred"). GetPrincipals ()? (Jaas에서는 역할이 주요한.)

나는 방법을 알고있다 주요한주제 ~로부터 logincontext, 그러나 그것은 두 가지 문제가 있습니다.

  1. 로그인의 순간에만 이루어지며, 앞서 언급 한 레지스트리를 코딩하고 저장하는 것이 좋습니다. 주제 그리고 주요한 AppServer가 이미 저장 한대로 직접 개체합니다.
  2. 바람직하게는 Fred가 현재 사용자가 아닌 경우 에도이 정보에 액세스 할 수 있기를 원합니다.

나는 부두를 사용하고 있지만 이러한 행동은 Jaas의 표준이라고 가정합니다.

도움이 되었습니까?

해결책

System EntryPoint (본 경우 서블릿 또는 EJB)에서 인증 된대로 현재 사용자를 참조하기 위해 ThreadLocal 변수를 사용합니다. 이를 통해 현재 사용자에게 '글로벌'액세스가 가능합니다. 이것은 JAA 또는 기타 보안 프로토콜과 직접 연결되어 있지 않지만 이들로부터 초기화 할 수 있습니다.

편집 : ThreadLocal의 반환은 현재 사용자의 주제입니다.

다른 사용자에게 액세스하는 것은 일반적으로 일부 유형의 관리자 모듈을 통해 수행됩니다.

다른 팁

내가 본 패턴은 다음과 같습니다.

AccessControlContext acc = AccessController.getContext();
Subject subject = Subject.getSubject(acc);
Set<Principal> principals = subject.getPrincipals();

본질적으로 이것은 현재 현재 스레드와 관련된 주제를 발견하고 교장을 요구합니다.

이것의 사용의 한 가지 예가 있습니다 Apache Jackrabbit'에스 repositoryImpl. 그것은 안에 있습니다 extendAuthentication 새로운 세션을 만들 때 현재 스레드가 어떤 JackRabbit 권리를 결정하는지를 결정하는 방법은 누구의 임무입니다.

그러나 이것이 적어도 J2EE 맥락에서 실제로 작동하는 것은 아니라고 주목해야합니다. JBoss AS7 에서이 코드를 사용하고 있으며 주제를 찾지 못하고 있습니다. 그러나 그것은 단지 버그 일 수 있습니다.

나에게 이것은 J2EE 애플리케이션 역할을 가진 AppSever의 사용자, 그룹 등을 만들어냅니다.

  • Certaion 사용자의 권한을 얻는 것은 관리 작업이며 일반적으로 AppServer 별 API를 사용하여 달성해야합니다.
  • JAAS 프로그래밍 모델은 더 높은 수준의 Abstratcion에서 작동합니다. 사용자가 J2EE 역할을하는지 여부 (응용 프로그램 내에서 정의) 정보 만 제공합니다.

나는 Jaas가 당신이하려는 일을 실제로 허용하지 않도록 설계되었다고 생각합니다. 내가 구축 한 앱에서 나는 그런 종류의 기능이 필요하다는 것을 알고 있습니다. JAA를 측면으로 만들어야했고 실제 Identity Repository, LDAP, ActivedIvertory 등이 무엇이든 직접 프로그램을 프로그램했습니다.

EJB 사용에서

@Resource(mappedName = "java:comp/EJBContext")
protected SessionContext sessionContext;

그리고 함께 시도하십시오 context.lookup("java:comp/EJBContext") 언제든지.


이 코드는 JBoss Server 제품군을위한 것이며, 다른 사람들은 JNDI를 찾아서 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top