Как проверить роль пользователя с помощью jaas и перенаправить пользователя в конкретный модуль на основе роли - PullRequest
0 голосов
/ 30 марта 2019

Цель: У меня есть 5 ролей, определенных в web.xml, и мне нужно реализовать аутентификацию на основе форм JAAS. Я успешно могу войти в систему, но перенаправление на основе аутентификации не работает, и все же я нахожусь на странице входа в систему с ошибкой, которая говорит неправильное имя пользователя или пароль Я не могу понять, как справиться с этим. Кроме того, пользователь может иметь несколько ролей, и пользователь может перемещаться в любом месте на основе этого. Я использую JSF, Primefaces, Wildfly 10.x, структуру сборки Maven, Mysql в качестве базы данных и JAAS.

Я искал по сети, но ни одно решение не смогло решить мою проблему, и я все еще борюсь.

Вот мой web.xml

<security-role>
<description>Administrator</description>
<role-name>ADMIN</role-name>
</security-role>
<security-role>
    <description>Accounting</description>
    <role-name>ACCOUNTS</role-name>
</security-role>

<security-role>
    <description>HR Management</description>
    <role-name>HR</role-name>
</security-role>

<security-role>
    <description>normal pages</description>
    <role-name>BASIC</role-name>
</security-role>


<login-config>
     <auth-method>FORM</auth-method>
     <realm-name>custom-authentication-security</realm-name>
     <form-login-config>
          <form-login-page>/index.xhtml</form-login-page>

          <form-error-page>/index.xhtml?fail=true</form-error-page>

     </form-login-config>
</login-config>
<security-constraint>
    <web-resource-collection>
         <web-resource-name>custom-authentication-security</web-resource-name>
         <url-pattern>/user/*</url-pattern>
         <http-method>POST</http-method>
          <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
         <role-name>ADMIN</role-name>
         <role-name>HR</role-name>
         <role-name>ACCOUNTS</role-name>
         <role-name>BASIC</role-name>
   </auth-constraint>
</security-constraint>

jboss-web.xml - это

<jboss-web>
        <security-domain>custom-authentication-security</security-domain>
</jboss-web>

Вот домен безопасности, определенный в standalone.xml:

 <security-domain name="custom-authentication-security" cache-type="default">
                    <authentication>
                        <login-module code="com.hotel.security.JAASLoginModule" flag="required">
                            <module-option name="hashAlgorithm" value="MD5"/>
                            <module-option name="hashEncoding" value="base64"/>
                            <module-option name="unauthenticatedIdentity" value="guest"/>
                        </login-module>
                    </authentication>
</security-domain>

и, наконец, мои login () и commit (), указанные в JAASLoginModule:

public boolean login() throws LoginException {
        System.out.println("Login Mathod Called");

        if (callbackHandler == null){
            throw new LoginException("Error: no CallbackHandler available " +
            "to garner authentication information from the user");
        }
        Callback[] callbacks = new Callback[2];
        callbacks[0] = new NameCallback("username");
        callbacks[1] = new PasswordCallback("password: ", false);

        try {

            callbackHandler.handle(callbacks);
            username = ((NameCallback)callbacks[0]).getName();
            password = ((PasswordCallback)callbacks[1]).getPassword();

            if (debug) {
                LOGGER.debug("Username :" + username);
                LOGGER.debug("Password : " + new String(password));
            }

            if (username == null || password == null) {
                LOGGER.error("Callback handler does not return login data properly");
                throw new LoginException("Callback handler does not return login data properly"); 
            }
            System.out.println("Username:"+username);
            System.out.println("password:"+new String(password));
            System.out.println("isValidUser:"+isValidUser());


            if (isValidUser()) { //validate user.
                succeeded = true;
                return true;
            } 

        } catch (IOException e) { 
             e.printStackTrace();
        } catch (UnsupportedCallbackException e) {
             e.printStackTrace();
        }

        return false;
    }

    @Override
    public boolean commit() throws LoginException {
        if (succeeded == false) {
            return false;
        } else {
            System.out.println("Adding Principals");

            userPrincipal = new JAASUserPrincipal(username);
            if (!subject.getPrincipals().contains(userPrincipal)) {
                subject.getPrincipals().add(userPrincipal);
                LOGGER.debug("User principal added:" + userPrincipal);
            }
            passwordPrincipal = new JAASPasswordPrincipal(new String(password)); 
            if (!subject.getPrincipals().contains(passwordPrincipal)) {
                subject.getPrincipals().add(passwordPrincipal);
                LOGGER.debug("Password principal added: " + passwordPrincipal);
            }

            //populate subject with roles.
            List<String> roles = Arrays.asList( new String[] {"ADMIN","HR","ACCOUNT","BASIC"});
            for (String role: roles) {
                JAASRolePrincipal rolePrincipal = new JAASRolePrincipal(role);
                if (!subject.getPrincipals().contains(rolePrincipal)) {
                    System.out.println("Adding role :"+ role);
                    subject.getPrincipals().add(rolePrincipal); 
                    LOGGER.debug("Role principal added: " + rolePrincipal);
                }
            }

            SessionManagerBean sessionBean=SessionFactoryImpl.getSessionManagerBean();
            sessionBean.setCurrentCuser(new CUserServiceImpl().getUserByName(username));

            sessionBean.setIsadmin(true);

            sessionBean.setIsuserloggedin(true);
            sessionBean.setUsername(username);
            sessionBean.setPassword(new String(password));

            commitSucceeded = true;

            LOGGER.info("Login subject were successfully populated with principals and roles"); 

            return true;
       }
   }

Теперь, когда я пытаюсь получить доступ к любой странице с помощью URL /user/ChangePassword.xhtml, он перенаправляет меня на login.xhtml, и когда я передаю неверные учетные данные, он возвращает меня на ту же страницу. это правильно. но URL не меняется на /index.xhtml, это проблема -1 .

Когда я передаю правильный логин и пароль, URL меняется на http://localhost:8080/HotelManager/user/j_security_check, и я снова получаю сообщение о неверном пароле пользователя.

После успешного входа в систему он должен быть перенаправлен в /user/ChangePassword.xhtml issue -2 .

Мне нужно обработать пользователя и перенаправить его на определенную страницу на основе роли , выпустить -3 .

Поиск решения. Надеюсь, что эксперты могут помочь.

Простите, если я не могу правильно объяснить ситуацию.

Заранее спасибо

...