最初は、認証と権限管理をカバーするフィルターを使用して開始できます。ResourceFilter と ContainerRequestFilter を実装すると、httpRequest を取得してセッションを取得し、アプリケーション/リクエストを関連するメソッドにリダイレクトできます。
権限管理のために、SecurityContext フィルターを実装できます。最初に isUserInRole をチェックして、リクエストをメソッド内に入れる必要があります。
SecurityContext 実装のサンプルは次のとおりです。
public class SecurityContextImpl implements SecurityContext {
private final SessionUser user;
public SecurityContextImpl(SessionUser user) {
this.user = user;
}
public Principal getUserPrincipal() {
return user;
}
public boolean isUserInRole(String role) {
if(user == null) {
throw new AuthenticationException();
}
if(ObjectUtil.isNull(user.getPrivileges())){
throw new AuthenticationException();
}
if(!user.getPrivileges().contains(role)) {
throw new InvalidAuthorizationHeaderException();
}
return user.getPrivileges().contains(role);
}
public boolean isSecure() {
return false;
}
public String getAuthenticationScheme() {
return SecurityContext.BASIC_AUTH;
}
}
基本的な SecurityContextFilter 実装は次のとおりです。
public class SecurityContextFilter implements ResourceFilter, ContainerRequestFilter {
private static final Logger LOG = LoggerFactory.getLogger(SecurityContextFilter.class);
protected static final String HEADER_AUTHORIZATION = "Authorization";
protected static final String HEADER_DATE = "x-java-rest-date";
protected static final String HEADER_NONCE = "nonce";
private HttpServletRequest httpRequest;
public SecurityContextFilter() {
}
public ContainerRequest filter(ContainerRequest request) {
SessionUser sessionUser = (SessionUser) httpRequest
.getSession()
.getAttribute("sessionUser");
request.setSecurityContext(new SecurityContextImpl(sessionUser));
return request;
}
public ContainerRequestFilter getRequestFilter() {
return this;
}
public ContainerResponseFilter getResponseFilter() {
return null;
}
public HttpServletRequest getHttpRequest() {
return httpRequest;
}
public void setHttpRequest(HttpServletRequest httpRequest) {
this.httpRequest = httpRequest;
}
}
フィルターを web.xml 内の init-param として配置することを忘れないでください。
次に、ロール権限認証ロジックでリクエストを処理できます。