Перенаправление на две разные страницы приветствия в зависимости от роли пользователя в Java EE 6 / Glassfish - PullRequest
1 голос
/ 28 февраля 2012

Я реализовал аутентификацию на основе FORM с помощью Glassfish 3.1 + JDBCRealm + MySQL (MD5). У меня только две роли: пользователь и администратор. Все идет отлично, из журнала видно, что аутентификация работает в обоих случаях как пользователь и администратор (см. Журнал ниже)

Q1: Можно ли создать два разных индексных файла, чтобы, когда пользователь является администратором, он / она переходил в /admin/index.xhtml, а когда пользователь был в роли пользователя, он переходил прямо к лица / пользователь / index.xhtml

Q2: Теперь, когда я вошел в систему как пользователь, я все еще могу перейти на «сторону администратора», просто записав всю ссылку прямо в поле адреса в браузере, почему, как этого избежать?

Q3: Когда я вошел в систему как пользователь и в списке файлов приветствия есть ТОЛЬКО лица / admin / index.xhtml, он перенаправляет меня в этот файл, даже если файл xml сообщает что-то еще, почему?

<welcome-file-list>
        <welcome-file>faces/admin/index.xhtml</welcome-file> *?? ----> it goes always here, cause it is the first one I think?*
       <welcome-file>faces/user/index.xhtml</welcome-file>
    </welcome-file-list>

    <security-constraint>
        <display-name>Admin Pages</display-name>
        <web-resource-collection>
            <web-resource-name>Protected Admin Area</web-resource-name>
            <description/>
            <url-pattern>/faces/admin/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>HEAD</http-method>
            <http-method>PUT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
            <http-method>DELETE</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>User Pages</display-name>
        <web-resource-collection>
            <web-resource-name>Protected Users Area</web-resource-name>
            <description/>
            <url-pattern>/faces/users/*</url-pattern>
            <!--url-pattern>/faces/users/index.xhtml</url-pattern-->
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>HEAD</http-method>
            <http-method>PUT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
            <http-method>DELETE</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>user</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>JDBCRealm</realm-name>
        <form-login-config>
            <form-login-page>/faces/loginForm.xhtml</form-login-page>
            <form-error-page>/faces/loginError.xhtml</form-error-page>
        </form-login-config>

    </login-config>
</web-app>

LOG:

FINE: Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule
FINEST: JDBC login succeeded for: admin groups:[admin, user]
FINE: JAAS login complete.
FINE: JAAS authentication committed.
FINE: Password login succeeded for : admin
FINE: Set security context as user: admin
FINE: [Web-Security] Setting Policy Context ID: old = null ctxID = jdbcrealm/jdbcrealm
FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission  GET)
FINE: [Web-Security] hasUserDataPermission isGranted: true
FINE: [Web-Security] Policy Context ID was: jdbcrealm/jdbcrealm
FINE: [Web-Security] Codesource with Web URL: file:/jdbcrealm/jdbcrealm
FINE: [Web-Security] Checking Web Permission with Principals : null

(Изменить после ответа myfear) ----- В glassfish-web.xml У меня есть такие роли. Если я правильно понял, это означает, что администратор относится к группам: администратор, клиент и пользователь. Клиент принадлежит к группам: клиент и пользователь, а пользователь принадлежит к группе пользователей. Правильно ли я понял?

    <security-role-mapping>
    <role-name>admin</role-name>
    <group-name>admin</group-name>
    <group-name>customer</group-name>
    <group-name>user</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>customer</role-name>
    <group-name>customer</group-name>
    <group-name>user</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>user</role-name>
    <group-name>user</group-name>
  </security-role-mapping>

</glassfish-web-app>

Спасибо! Сами

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Для вашего вопроса 1: используйте фильтр, из которого вы можете перенаправить пользователя на определенную страницу либо userlogin.xhtml, либо adminlogin.xhtml

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    String userName = SecurityAssociation.getPrincipal().getName();
    String userNameSubject = SecurityAssociation.getSubject().toString();

    System.out.println("Yeeey! Get me here and find me in the database: " + userName+ " Subject : "+userNameSubject);

    filterChain.doFilter(servletRequest, servletResponse);
}
0 голосов
/ 29 февраля 2012

A1) Приветственные файлы не связаны с ролями. Если вам нужно выполнить какую-либо логику для отправки пользователей, вам нужно подумать об использовании логического HttpServletRequest.isUserInRole (String role) или о чем-то похожем, чтобы выяснить, в какой роли находится пользователь.

A2) Этого не должно быть. Вам нужно проверить роли, которые у вас есть в вашем JDBCRealm. К тому, что я вижу здесь, все настроено правильно.

A3) Я не уверен, правильно ли я понимаю ваш файл замечаний "XML". Но welcome-файлы не связаны с ролями и ... см. A1)

Спасибо, M

...