2012-02-27 4 views
1

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

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

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

Q3: Когда я вошел в систему как пользователь и у меня есть только лица/администратор/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 

(Edit после ответа myfear в) ----- В GlassFish-web.xml У меня есть роли, как это. Если я правильно понял, это означает, что admin принадлежит к группам: admin, customer и user. Клиент принадлежит к группам: клиент и пользователь, а Пользователь принадлежит пользователю группы. Правильно ли я это понял?

<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> 

Спасибо! Sami

ответ

0

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

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

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

Спасибо, M

+0

Спасибо, мой страх! Поэтому он должен работать, как я думал. Если у вас есть admin для /faces/admin/* Кто-нибудь, кроме человека в роли администратора, должен войти? В моем случае все, кто прошел проверку подлинности, могут войти. Я немного обновил этот вопрос. – Sami

0

Для вашего вопроса 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

Спасибо! Не могли бы вы быть немного более конкретными, зимой я как снеговик. Без аутентификации пользователь переходит к index.xhtml и после входа пользователь переходит на другую страницу после того, как класс контроллера извлек некоторые данные из базы данных. Вход ---> JDBC-realm ---> Если успех, метод в контроллере или другой выборке данных --- --- DB ----> view.Где я должен реализовать этот фильтр и как и где я могу прервать аутентификацию, управляемую контейнером, для извлечения данных из db с данными аутентифицированного пользователя? – Sami

+0

http://www.oracle.com/technetwork/java/filters-137243.html – Sami

Смежные вопросы