【问题标题】:"Forbidden", cannot authenticate using JAAS (WildFly)“禁止”,无法使用 JAAS (WildFly) 进行身份验证
【发布时间】:2015-01-26 08:52:54
【问题描述】:

我已经按照所有教程中的说明完成了。

  1. 将 MySql 连接 jar 作为模块添加到 WildFly (mySql-conn-driver.jar)

module add --name=com.mysql --resources=/path/to/mysql-connector-java-5.1.24-bin.jar --dependencies=javax.api,javax.transaction.api

/subsystem=datasources/jdbc-driver=mysql:add(driver-name=mysql,driver-module-name=com.mysql,driver-class-name=com.mysql.jdbc.Driver)

  1. 添加数据源

[standalone@localhost:9990 /] /subsystem=datasources/data-source=niwads:add( driver-name=mysql, user-name=db_user, password=secret, connection-url=jdbc:mysql://localhost:3306/appdb, min-pool-size=5, max-pool-size=15, jndi-name=java:/jdbc/niwads, enabled=true, validate-on-match=true, valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker, exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter )

  1. 在浏览器中使用 GUI 创建安全域,而不是 CLI。最终结果是这样的:

    <security-domain name="niwasdnew" cache-type="default">
    <authentication>
        <login-module code="Database" flag="required">
            <module-option name="dsJndiName" value="java:/jbdc/niwads" /> 
            <module-option name="principalsQuery" value="select password as 'Password' from user_account where nickname=?" />
            <module-option name="rolesQuery" value="select r.rolname as 'Role', r.rolname as 'RoleGroup' from user_account u, role r where r.id=u.role_key and u.nickname=?" />
        </login-module>
    </authentication>
    

  2. 创建 jboss-web.xml 并将其添加到 WEB-INF:

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-web>
            <security-domain>niwasdnew</security-domain>
    </jboss-web>
    
  3. 我的 web.xml 具有 FORM 身份验证角色等等:

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>pages for masters</web-resource-name>
            <url-pattern>/sections/master/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
         </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>pages for gardeners</web-resource-name>
            <url-pattern>/sections/gardener/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>gardener</role-name>
        </auth-constraint>
    </security-constraint>
    
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.xhtml</form-login-page>
            <form-error-page>/error.xhtml</form-error-page>
        </form-login-config>
    </login-config>
    
    <security-role>
        <role-name>admin</role-name>
    </security-role>
    <security-role>
        <role-name>gardener</role-name>
    </security-role>
    

在这一切之后,我在 WildFly 上开始了我的项目,我看到了我的欢迎页面,进入登录页面,按登录按钮填写所需字段它会根据用户的角色将我重定向到适当的位置

但我只看到“禁止”错误页面!

我做错了什么?我错过了什么?

【问题讨论】:

  • 一种测试方法是在未受保护的 URL 中添加一个 servlet 并打印/记录请求中的信息(remoteUser、userInRole 等)
  • @SJuan76 所有项目都使用 jsf 模板,所以我在页面顶部显示用户信息,当我返回欢迎页面时,它会显示用户信息,例如用户通过身份验证。

标签: jakarta-ee wildfly jaas


【解决方案1】:

我终于找到了我的问题的答案。在这个recourse 这表明我在 步骤 3 中犯了一个错误,我在 SQL 语句中写了 module-option name="rolesQuery"select r.rolname as 'Role', r.rolname as 'RoleGroup' 来自用户帐户 u,角色 r,其中 r.id=u.role_key 和 u.nickname=?

来自资源

注意:RoleGroup 列的值始终必须是 Roles(大写“R”)。这是 JBoss 特有的。

所以正确的 SQL 语句确实有效,在我的情况下 - select r.rolname as 'Role', 'Roles' as 'RoleGroup' from user_account u, role r where r.id =u.role_key 和 u.nickname=?——正确答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 2021-07-21
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多