Wildfly 8 基本身份验证

Posted

技术标签:

【中文标题】Wildfly 8 基本身份验证【英文标题】:Wildfly 8 Basic Authentication 【发布时间】:2015-03-27 07:10:21 【问题描述】:

我在 Wildfly 8 上运行了一个 Java-Webapp。我尝试使用 resteasy Annotations 来保护我的 restful web 服务。我使用命令行工具 curl 来测试其余的 api。

基本身份验证设置似乎有效。带有注释“@PermitAll”的对 Web 服务的 Http 请求工作正常。卷毛说:

~ % curl -v http://localhost:8080/ItilityServer-web/rest/account 
> GET /ItilityServer-web/rest/account HTTP/1.1
> User-Agent: curl/7.40.0
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
< Server: WildFly/8
< Content-Length: 0
< Date: Wed, 28 Jan 2015 10:47:11 GMT
< 
* Connection #0 to host localhost left intact

但包含有效用户名和密码的 http 请求被拒绝,状态码 401 未授权。 Wildfly 记录错误密码不匹配:

2015-01-28 11:42:43,565 TRACE [org.jboss.security] (default task-5) PBOX000263: Executing query SELECT a.password FROM Account a WHERE a.name = ? with username hans
2015-01-28 11:42:43,566 DEBUG [org.jboss.security] (default task-5) PBOX000283: Bad password for username hans

但事实并非如此。解密的授权详细信息“aGFuczpoZWxtaWhlbG1paGVsbWk=”是 hans:helmihelmihelmi,并且此用户名和密码存储在我的数据库中。与 security-domain 使用相同的 jpql-queries 会导致 unsername "hans" 和他的密码 "helmihelmihelmi"。

这是我的设置:

web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">

<context-param>
    <param-name>resteasy.role.based.security</param-name>
    <param-value>true</param-value>
</context-param>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Application</realm-name>
</login-config>

<security-role>
    <role-name>store</role-name>
</security-role>

</web-app>

(我不知道什么是安全领域,所以我只是在 login-config 标签中留下了这个属性)

standalone.xml 中的我的安全域

<security-domain name="DBLogin" cache-type="default">
    <authentication>
        <login-module code="Database" flag="required">
            <module-option name="dsJndiName" value="java:jboss/datasources/ExampleDS"/>
            <module-option name="principalsQuery" value="SELECT a.password FROM Account a WHERE a.name = ?"/>
            <module-option name="rolesQuery" value="SELECT a.userRole FROM Account a WHERE a.name = ?"/>
            <module-option name="hashAlgorithm" value="SHA-256"/>
            <module-option name="hashEncoding" value="Base64"/>
            <module-option name="hashCharset" value="UTF-8"/>
            <module-option name="unauthenticatedIdentity" value="guest"/>
        </login-module>
    </authentication>
</security-domain>

宁静的网络服务

@GET
@RolesAllowed(AuthRole.STORE)
@Produces(MediaType.APPLICATION_JSON)
public Response getAccountByName() 
    Response.ResponseBuilder builder = Response.ok();
    return builder.build();

和 import.xml 在启动时创建用户

insert into Account(id, name, email, password, user_role) values (0, 'hans', 'john.smith@mailinator.com', 'helmihelmihelmi', 'store') 
insert into Store(id, name, zipcode, street, housenumber, town, account_id) values(0, 'Edeka', 72622, 'stephanstraße', 10, 'Reudern', 0);

不知道如何找到解决方案,因为我什至不知道问题所在。希望有人能帮忙。

【问题讨论】:

【参考方案1】:

您不能将未加密的密码存储在数据库中。 WildFly 希望您使用 login-module 配置中指定的散列算法和编码来存储 散列 密码。

创建新的Account 时,使用

org.jboss.security.auth.spi.Util.createPasswordHash()

获取哈希密码进行存储。

通常,存储原始密码存在安全风险。

【讨论】:

这就是解决方案!非常感谢。 恕我直言,如今存储原始或不安全的散列密码应被视为犯罪过失。

以上是关于Wildfly 8 基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wildfly 中提供自定义身份验证/授权管理器

Wildfly 11 Elytron - 基于属性文件的身份验证失败,未安装所需的服务

为基于Wildfly容器的身份验证生成salted /哈希密码

使用对Wildfly 10的远程EJB调用进行身份验证时出现问题

使用 WildFly 在 JMS 中进行 JAAS 身份验证:javax.jms.JMSSecurityException:HQ119032:用户:null 没有权限 = 在地址 2 上发送

(407) 需要代理身份验证 - 基本身份验证