首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Wildfly 9安全域不能工作

Wildfly 9安全域不能工作
EN

Stack Overflow用户
提问于 2016-05-24 22:39:47
回答 1查看 1.3K关注 0票数 0

我正在从jboss 6迁移一个大型web应用程序到通配符9,并且在途中遇到了一些障碍。

其中之一是安全域。

standalone.xml的相关部分如下:

代码语言:javascript
运行
复制
<subsystem xmlns="urn:jboss:domain:security:1.2">
    <security-domains>
        <security-domain name="other" cache-type="default">
            <authentication>
                <login-module code="Remoting" flag="optional">
                    <module-option name="password-stacking" value="useFirstPass"/>
                </login-module>
                <login-module code="RealmDirect" flag="required">
                    <module-option name="password-stacking" value="useFirstPass"/>
                </login-module>
            </authentication>
        </security-domain>
        <security-domain name="jboss-web-policy" cache-type="default">
            <authorization>
                <policy-module code="Delegating" flag="required"/>
            </authorization>
        </security-domain>
        <security-domain name="jboss-ejb-policy" cache-type="default">
            <authorization>
                <policy-module code="Delegating" flag="required"/>
            </authorization>
        </security-domain>
        <security-domain name="mydomain" cache-type="default">
            <authentication>
                <login-module code="foo.token.LoginModule" flag="required">
                    <module-option name="hashAlgorithm" value="SHA-512"/>
                    <module-option name="hashEncoding" value="base64"/>
                    <module-option name="unauthenticatedIdentity" value="guest"/>
                    <module-option name="dsJndiName" value="jdbc/fooDS"/>
                    <module-option name="principalsQuery" value="select ..."/>
                    <module-option name="rolesQuery" value="select o.name, 'Roles' from roles up join ef_usuario ..."/>
                </login-module>
            </authentication>
        </security-domain>
    </security-domains>
</subsystem>

foo.token.LoginModule.java是这样的:

代码语言:javascript
运行
复制
@NoArgsConstructor
public class FooLoginModule extends DatabaseServerLoginModule {

    private Principal principal;
    private String userName;

    @Override
    public boolean login() throws LoginException {
        super.loginOk = false;
        super.loginOk = tryLogin();
        return super.loginOk;
    }

    protected boolean tryLogin() throws LoginException {
        if (doesSomeAdditionalLoginValidation()) {
            createPrincipal();
            return true;
        }
        return false;
    }

    @VisibleForTesting
    protected UserResourceClient createUserResourceClient() {
        return new UserResourceClient( createAuth(), createEndPoint() );
    }

    private EndPoint createEndPoint() {
        return new EndPointProvider( ... ).create();
    }

    private Auth createAuth() {
        return new AuthProvider( ... ).createAuth();
    }

    private void createPrincipal() throws LoginException {
        try {
            principal = createIdentity( userName );
        } catch (Exception e) {
            throw new LoginException( PROCESSING_FAILED + "Failed to create principal: " + e.getMessage() );
        }
    }

    @Override
    protected String getUsername() {
        return userName;
    }

    @Override
    protected Principal getIdentity() {
        return principal;
    }

}

这个应用程序是作为一个ear部署的,所以,在.war文件中,我有一个jboss-web.xml,而在.jar文件中,我有一个jboss-app.xml。jboss:

代码语言:javascript
运行
复制
<jboss-web>
    <security-domain>mydomain</security-domain>
</jboss-web>

jboss:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<jboss-app>
    <security-domain>mydomain</security-domain>
</jboss-app>

但是,当我尝试使用带有@SecurityDomain("mydomain")注释的@SecurityDomain("mydomain") bean时,我会得到访问错误:

19:35:40,530错误org.jboss.as.ejb3.invocation WFLYEJB0034: EJB调用在组件FooService上失败--公共java.lang.String foo.service.blah.FooService.find():javax.ejb.EJBAccessException: WFLYEJB0364:对方法的调用: bean: FooService的公共java.lang.String foo.service.blah.FooService.find()

FooService的代码如下所示:

代码语言:javascript
运行
复制
@Stateless
@SecurityDomain("mydomain")
public class FooService {

    public List<Foo> find() {
        return ...;
    }
}

我看到前缀java:/jaas/必须从任何地方删除,我做到了,但这仍然行不通。

在迁移指南中找不到与此相关的任何其他东西。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-25 17:08:44

本质上,默认行为会发生变化。

在JBoss AS上,如果没有指定角色,则默认行为为@PermitAll,在Wildfly中,它是由default-missing-method-permissions-deny-access配置的,默认为@DenyAll

我把我的standalone.xml改成了这样的东西:

代码语言:javascript
运行
复制
<subsystem xmlns="urn:jboss:domain:ejb3:3.0">
    <!-- other stuff -->
    <default-missing-method-permissions-deny-access value="false"/>
    <!-- other stuff -->
</subsystem>

和以前一样起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37425056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档