jakarta-ee - javax.ejb.EJBAccessException 使用 CustomAuthMechanism 登录后用户无效,但我有权访问 page.xhtml
问题描述
环境:
- 老板 7.2
- 爪哇 11
通过 CustomAuthenticationMechanism 登录后,我尝试使用 @RolesAllowed 调用方法 CompanyService.findFirst() 但似乎 EJBContainer 不知道我的权限。我加载了显示我有角色 AF_ADMIN 的页面 login-private.xhtml 但是当我调用 findFirst() 我得到 javax.ejb.EJBAccessException: WFLYSEC0027: Invalid User
我应该授予或告诉 EJB 身份验证权限吗?
我错过了什么吗?
jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-app>
<security-domain>jaspitest</security-domain>
</jboss-app>
公司服务
@Stateless
@RolesAllowed("**")
public class CompanyService extends BusinessService<Company> implements CompanyServiceable {
public CompanyService() {
super(Company.class);
}
@Override
public List<Company> findFirst() throws AppException {
...
}
...
自定义身份验证机制
@AutoApplySession
@LoginToContinue
@ApplicationScoped
public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism {
@Inject
private IdentityStoreHandler idStoreHandler;
//@Override
public AuthenticationStatus validateRequest(HttpServletRequest request, HttpServletResponse response, HttpMessageContext httpMessageContext) throws AuthenticationException {
final String ticket = request.getParameter("ticket");
if (ticket != null) {
CredentialValidationResult result = idStoreHandler.validate(new UsernamePasswordCredential(ticket, Arrays.toString("LOGIN_PASSWORD")));
if (result.getStatus() == VALID) {
return httpMessageContext.notifyContainerAboutLogin(result);
} else {
return httpMessageContext.responseUnauthorized();
}
}
return httpMessageContext.doNothing();
}
}
login-private.xhtml显示我有 AF_ADMIN
...
<h1>Public</h1>
<div class="alert alert-danger" role="alert">
#{myBean.initBean()}
<h:outputText value="inRole(AF_ADMIN): #{request.isUserInRole('AF_ADMIN')}"/><br/>
<h:outputText value="requestURL: #{request.requestURL}"/><br/>
<h:outputText value="headerNames: #{request.headerNames}"/><br/>
#{requestScope['javax.servlet.error.status_code']}
#{requestScope['javax.servlet.error.message']}<br/>
#{messages['error.inesperat']}
</div>
...
解决方案
Jboss/Wildfly 独立配置具有默认安全域到其他不传播身份验证到 ejb 因此,作为一种解决方法,我们可以从standalone.xml 中删除以下行以使其工作。
<!--default-security-domain value="other"/-->
您可以毫无问题地执行 ejb 方法。
推荐阅读
- javascript - 禁用右键单击 html5 音频元素
- nativescript - Nativescript 选项卡:想要路由到不是选项卡的模板/组件
- sql - Django - 如果另一列不同,则求和
- amazon-web-services - 确定和更新 AWS Lambda 上的 openssl 版本
- c - 为什么要使用函数指针?
- python - 第 3 行,在
从 app.forms 导入 LoginForm - javascript - Firebase JS SDK OAuth2 请求参数:access_type: 'offline'
- excel - 导入带有前导空单元格的 excel 删除逗号
- python - 显示语法错误:Jupyter Notebook 上打印语句的语法无效
- selenium - 用 selenium chromedriver 刮痧现在似乎要慢得多