私はあまりにも長い間投稿を掘り下げていて、めまいがするので、ここの教祖の一人がこれを手伝ってくれることを願っています.
コンテナ管理認証を使用していますが、うまく機能しています。認証するためのRealmセットアップ、web.xmlで保護されたURLのセットアップ、ログインページなどがあります。
しかし今、私は問題にぶつかっています...
データモデル用の JPA オブジェクトがあり、これらのオブジェクトの一部は、いつ作成または更新されたか、誰によって追跡されるかという点で「監査」されています。
@PrePersist
次のように、コードでハンドラーを使用して、永続化/更新のフィールドcreatedOn
とフィールドをそれぞれ設定しています。updatedOn
@PrePersist
protected void onCreate() {
this.setCreatedOn(new Date());
}
これはうまく機能しますが、ここから現在ログインしているユーザーにアクセスする方法がわかりません...createdBy
フィールドを設定できるようにする必要があります。
私はResteasyを使用しており、エンドポイントでログインしているユーザー名にアクセスでき、アカウント オブジェクトを取得できます。
@Path("/test")
public class TestEndpoint {
@EJB
AuthorizationService authService;
@GET
@Path("path")
@Produces("application/json")
@RolesAllowed("User")
public Response test() {
Account account = authService.getLoggedInAccount();
return account == null ? Response.status(Status.NOT_FOUND).build() : Response.ok().entity(account).build();
}
}
AuthorizationService は私のもので、次のようになります。
@Stateless
@LocalBean
public class AuthorizationService {
@Inject
HttpServletRequest request;
public Account getLoggedInAccount() {
Account result = (Account) request.getAttribute(LOGGED_IN_USER);
if (result == null) {
Principal principal = request.getUserPrincipal();
if (principal != null) {
List<Account> results = crudService.find(Account.BY_NAME, Params.of("name", principal.getName()), 0, 0);
if (results != null && results.size() > 0) {
result = results.get(0);
request.setAttribute(LOGGED_IN_USER, result);
}
}
}
return result;
}
}
これは機能します。毎回DBにクエリを送信しないように、リクエスト属性にログインしたユーザーをキャッシュすることに注意してください。
今まではこの設定でうまくやっていたのですが、やり方が間違っているような気がします...
現在ログインしているユーザーの Account オブジェクトを使用して...何か... (リクエスト?) を設定し、必要な場所に挿入できるようにするグローバル インターセプト ポイント (フィルター?) を 1 つ用意したいと考えています...アプリをできるだけスケーラブルにしようとしているので、セッションを作成しないソリューションを強くお勧めします。
これを処理する方法に関するヒントはありますか?これをうまく説明しているチュートリアルへのゴールデンリンクはありますか?助けてくれてありがとう!