Цель:
У меня есть 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 .
Поиск решения. Надеюсь, что эксперты могут помочь.
Простите, если я не могу правильно объяснить ситуацию.
Заранее спасибо