Безопасность Glassfish 3 - Аутентификация на основе форм с использованием области JDBC

Я хочу понять безопасность на основе форм и области JDBC с помощью glassfishV3, поэтому я решил создать небольшое приложение, которое просто позволяет входить и выходить, я следовал инструкциям из этого книга для этого.

Я понимаю, как работает функция удержания, но что-то не так, и я не могу заставить ее работать должным образом.

Сначала я создал небольшую базу данных с аннотациями JPA:

@Entity
@Table(name="USERS")
public class User implements Serializable {

    private static final long serialVersionUID = -1244856316278032177L;
    @Id
    @GeneratedValue
    @Column(nullable = false)
    private Long id;
    @Column(nullable = false)
    private String email;
    @Column(nullable = false)
    private String password;
    @OneToMany(mappedBy = "user")
    private List groups;
    //GET & SET METHODS...

}

Вот другая таблица, содержащая роли для каждого пользователя

@Entity
@Table(name="GROUPS")
public class Group implements Serializable {

    private static final long serialVersionUID = -7274308564659753174L;
    @Id
    @GeneratedValue
    @Column(nullable = false)
    private Long id;
    @Column(nullable = false)
    private String groupName;
    @ManyToOne
    @JoinColumn(name = "USERS_ID", nullable = false)
    private User user;
    //GET & SET METHODS...
    }

Когда БД была готова, я добавил некоторые данные вручную

enter image description here

Следующим шагом было для настройки области безопасности.

enter image description here

Затем добавил конфигурацию безопасности в мой файл web.xml




    CHAPTER x 12 Container Managed Authentication and
        Authorization
    
        index.xhtml
    
    
        Faces Servlet
        javax.faces.webapp.FacesServlet
        1
    
    
        Faces Servlet
        *.xhtml
    

    
        
            VISITOR PERMISIONS           
            /index.xhtml         
            /visitorpanel.xhtml
            GET
            POST
        
        
            visitors
            users
            administrators
        
    

    
        
            USERS PERMISIONS         
            /userpanel.xhtml
            /index.xhtml         
            /visitorpanel.xhtml
            GET
            POST         
        
                   
            users
            administrators
        
    

    
        
            ADMIN PERMISIONS             
            /adminpanel.xhtml
            /userpanel.xhtml
            /index.xhtml         
            /visitorpanel.xhtml          
            GET
            POST
        
                   
            administrators
        
    

    
        FORM
        DBRealm
        
            /index.xhtml
            /error.xhtml
        
    

    
    visitors
    

    
    users
    

    
    administrators
    

Мои цели здесь были:

  • администраторы могут видеть все страницы

  • посетители могут видеть только index.xhtml и visitorpanel.xhtml

  • пользователи могут видеть index.xhtml, visitorpanel.xhtml и userpanel.xhtml

Я думаю, что конфигурация правильная.

Наконец, последним шагом было создание формы входа в систему на странице index.xhtml:



Программа работает нормально, но у меня возникают следующие проблемы:

1- Когда я пытаюсь войти в систему как пользователь или как администратор (посетителям не нужно входить в систему), я перенаправляюсь на страницу error.xhtml и вижу в консоли исключение:

SEVERE: SEC1112: Невозможно проверить пользователя (скрыто) для области JDBC . ПРЕДУПРЕЖДЕНИЕ: не удалось войти в систему через Интернет: ошибка входа: javax.security.auth.login.LoginException: исключение безопасности ПРЕДУПРЕЖДЕНИЕ: PWC4011: невозможно установить кодировку символов запроса на UTF-8 из контекста / CHAPTER_12_x_Container_Managed_Authentication_and_Authorization, , поскольку параметры запроса уже были прочитаны , или ServletRequest.getReader () уже был вызван

2- Когда я пытаюсь перейти к некоторым страницам через URL-адрес, ничего не происходит. Я думаю, что это нормально, но когда я пытаюсь посетить visitorpanel.xhtml, он должен позволить мне, потому что нет необходимости входить в систему, чтобы увидеть его. Нужно ли мне удалять эту страницу из конфигурации безопасности, если я хочу, чтобы ее видели все?

3- Также мне любопытно, почему я не могу использовать тег h: form вместо простой формы, когда я реализую вход в систему?

Я очень признателен за помощь, я уже несколько часов читал первые главы книги и пытаюсь реализовать свой пример, но я застрял. Думаю, я близок к решению.

Обновление

Я изменил принципала по умолчанию на имя пользователя посетителей. Но это все еще не работает

enter image description here

И я также добавил еще несколько параметров в свою конфигурацию Realm

enter image description here

Но когда я пытаюсь войти в систему, я все еще вижу исключение, которое говорит:

SEVERE: SEC1112: Cannot validate user (hidden ) для области JDBC . ПРЕДУПРЕЖДЕНИЕ: не удалось войти в систему через Интернет: ошибка входа: javax.security.auth.login.LoginException: исключение безопасности ПРЕДУПРЕЖДЕНИЕ: PWC4011: невозможно установить кодировку символов запроса на UTF-8 из {{1} } context / CHAPTER_12_x_Container_Managed_Authentication_and_Authorization, потому что параметры запроса уже были прочитаны, или ServletRequest.getReader () уже был вызван

Я все еще не знаю, что отсутствует .

-Может быть, имя таблицы не должно быть в верхнем регистре?

-Может быть, что имена столбцов не должны быть в верхнем регистре?

-Может быть, таблицы созданы неправильно?

-Может быть, я не могу использовать ПАРОЛЬ в качестве имени столбца, потому что это вызывает какой-то конфликт?

Я действительно не понимаю, почему это исключение. Я пропинговал базу данных из панели администратора, и все кажется правильным.

Может ли кто-нибудь помочь мне разобраться в этом?

Обновление 2

Я изменил параметр ведения журнала javax.enterprise.system.core.security на уровень FINE, чтобы иметь больше информации при возникновении исключений. Это был результат, когда я пытался войти в систему:

FINE : Intercept Entry: intercept: SOAP defaultServerID: null defaultClientID: null FINE: ID Entry: класс модуля: com.sun.xml.wss.provider .ClientSecurityAuthModule id: XWS_ClientProvider тип: клиент политика запроса: javax.security.auth.message.MessagePolicy@e95a72 политика ответа: javax.security.auth .message.MessagePolicy @ 310a6d параметры: {signature.key.alias = s1as, debug = false, dynamic.username.password = false, encryption.key.alias = s1as} FINE: ID Запись: класс модуля: com.sun.xml.wss.provider.ClientSecurityAuthModule id: ClientProvider тип: клиент политика запроса: javax.security.auth .message.MessagePolicy @ 1829770 политика ответа: javax.security.auth.message.MessagePolicy@a4461e параметры: {signature.key.alias = s1as , debug = false, dynamic.username.password = false, encryption.key.alias = s1as, security.config = C: \ jeeAplicationServer \ glassfishv3 \ glassfish \ domains \ domain1 / config / wss-server-config -1.0.xml} FINE: ID Entry: класс модуля: com.sun.xml.wss.provider.ServerSecurityAuthModule id: XWS_ServerProvider тип: сервер политика запросов: javax.security.auth.message.MessagePolicy @ f79c86 политика ответа: javax.security.auth.message.MessagePolicy@454bf7 параметры: {signature.key.alias = s1as, debug = false, encryption.key.alias = s1as} FINE: ID Entry: класс модуля: com.sun.xml.wss.provider.ServerSecurityAuthModule id: ServerProvider тип: сервер политика запросов: javax. security.auth.message.MessagePolicy@17e85e4 политика ответа: javax.security.auth.message.MessagePolicy@1887906 параметры: {signature.key.alias = s1as, debug = false, шифрование. key.alias = s1as, security.config = C: \ jeeAplicationServer \ glassfishv3 \ glassfish \ domains \ domain1 / config / wss-server-config-1.0.xml} ОТЛИЧНО: [Web- Безопасность] Настройка идентификатора контекста политики: old = null ctxID = CHAPTER_x_12_Container_Managed_Authentication_and_Authorization / CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE: [Web-Security]. POST) FINE: [Web-Security] ха sUserDataPermission isGranted: true FINE: Вход пользователя (скрыт) в область: DBRealm с использованием модуля JAAS : jdbcRealm FINE: Инициализирован модуль входа: класс com.sun.enterprise.security .auth.login.JDBCLoginModule СЕРЬЕЗНО: SEC1112: Невозможно проверить пользователя (скрыто) для области JDBC. FINE: Невозможно проверить пользователя javax.security.auth.login.LoginException: Невозможно подключиться к источнику данных jdbc / security для пользователя базы данных. в com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.getConnection (JDBCRealm.java:550) в com.sun.enterprise.security.auth .realm.jdbc.JDBCRealm.isUserValid (JDBCRealm.java:393) в com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.аутентифицировать (JDBCRealm.java:311) в com.sun.enterprise.security.auth.login.JDBCLoginModule.authenticate (JDBCLoginModule.java:72) в {{1 }} com.sun.enterprise.security.auth.login.PasswordLoginModule.authenticateUser (PasswordLoginModule.java:90) в com.sun.appserv.security.AppservPasswordLoginModule.login (AppservPasswordLoginModule : 141) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в {{1} } sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.lang.reflect.Method.invoke (Method.java:597) в javax.security.auth.login .LoginContext.invoke (LoginContext.java:769) в javax.security.auth.login.LoginContext.access $ 000 (LoginContext.java:186) в {{1 }} javax.security.auth.login.LoginContext $ 4.run (LoginContext.java:683) в java.security.AccessController.doPrivileged (собственный метод) в javax. security.auth.login.LoginContext.invokePriv (LoginContext.java:680) в javax.security.auth.login.LoginContext.login (LoginContext.java:579) в com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin (LoginContextDriver.java:341) в com.sun.enterprise.security.auth.login .LoginContextDriver.login (LoginContextDriver.java:199) в com.sun.enterprise.security.auth.login.LoginContextDriver.login (LoginContextDriver.java:152) в com.sun.web.security.RealmAdapter.authenticate (RealmAdapter.java:479) в com.sun.web.security.RealmAdapter.authenticate (RealmAdapter.java: 418) в org.apache.catalina.authenticator.FormAuthenticator.authenticate (FormAuthenticator.java: 264) в org.apache.catalina.authenticator.AuthenticatorBase.processSecurityCheck (AuthenticatorBase.java:1015) в org.apache.catalina. AuthenticatorBase.invoke (AuthenticatorBase.java:614) в org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:615) в com.sun .enterprise.web.WebPipeline.invoke (WebPipeline.java:97) в com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke (PESessionLockingStandardPipeline.java:85) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:185) в org.apache.catalina.connector.CoyoteAdapter.doService (CoyoteAdapter.java:325) {{1 }} в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:226) в com.sun.enterprise.v3.services.impl.ContainerMapper .service (ContainerMapper.java:165) в com.sun.grizzly.http.ProcessorTask.invokeAdapter (ProcessorTask.java:791) в com .sun.grizzly.http.ProcessorTas k.doProcess (ProcessorTask.java:693) в com.sun.grizzly.http.ProcessorTask.process (ProcessorTask.java:954) в com.sun.grizzly .http.DefaultProtocolFilter.execute (DefaultProtocolFilter.java:170) в com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter (DefaultProtocolChain.java:135) в {{1} } com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:102) в com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:88) в com.sun.grizzly.http.HttpProtocolChain.execute (HttpProtocolChain.java:76) в com.sun.grizzly.ProtocolChainContextTask.doCall (ProtocolChainContextTask.java:53) в com.sun.grizzly.SelectionKeyContextTask.call (SelectionKeyContextTask.java: 57) в com.sun.grizzly.ContextTask.run (ContextTask.java:69) в com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork (AbstractThreadPool.java: 330)в com.sun.grizzly.util.AbstractThreadPool $ Worker.run (AbstractThreadPool.java:309) в java.lang.Thread.run (Thread.java:662) Вызвано: { {1}} javax.naming.NamingException: Ошибка поиска для 'jdbc / security' в SerialContext [корневое исключение - javax.naming.NameNotFoundException: безопасность не найдена] в com.sun.enterprise.naming.impl.SerialContext.lookup (SerialContext.java:442) в javax.naming.InitialContext.lookup (InitialContext.java:392) в javax.naming. InitialContext.lookup (InitialContext.java:392) в com.sun.enterprise.connectors.service.ConnectorResourceAdminServiceImpl.lookup (ConnectorResourceAdminServiceImpl.java:203) в com.sun .enterprise.connectors.ConnectorRuntime.lookupNonTxResource (ConnectorRuntime.java:440) в com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.getConnection (JDBCRealm.java:538) ... еще 44 Причина: javax.naming.NameNotFoundException: безопасность не найдена в com.sun.enterprise.naming.imp l.TransientContext.doLookup (TransientContext.java:197) в com.sun.enterprise.naming.impl.TransientContext.lookup (TransientContext.java:168) в { {1}} com.sun.enterprise.naming.impl.TransientContext.lookup (TransientContext.java:172) в com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup (SerialContextProviderImpl .java: 58) в com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup (LocalSerialContextProviderImpl.java:101) в com.sun .enterprise.naming.impl.SerialContext.lookup (SerialContext.java:430) ... еще 49

FINE: аутентификация JAAS прервана. ПРЕДУПРЕЖДЕНИЕ. Ошибка входа в систему через Интернет: ошибка входа : javax.security.auth.login.LoginException: исключение безопасности FINE: [Web-Security] идентификатор контекста политики был: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization / CHAPTER_x_12_Container_Managed_Authentication_and_Authorization has FINE: [Web-perserm}] javax.security.jacc.WebUserDataPermission /error.xhtml GET) FINE: [Web-Security] hasUserDataPermission isGranted: true

Обновление 3

Возможно, что-то не так с пулом подключений. {{1 }} Вот как выглядит мой пул соединений:

enter image description here

enter image description here

enter image description here

У меня мало свойств, может чего-то не хватает?

Также теперь я создал ресурс JDBC, который выглядит так:

enter image description here

(Имя JNDI в Realm был изменен на jdbc / studydb)

Мой файл persistence.xml выглядит следующим образом:



    
        jdbc/studydb     
        entities.User
        entities.Group
    

Думаю, я добился некоторого прогресса, теперь я вижу исключение:

> SEVERE: jdbcrealm.invaliduserreason
>      FINE: Cannot validate user
>      java.sql.SQLSyntaxErrorException: Schema 'ADMIN' does not exist
>       at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown
> Source)
>      ....
>      
>      Caused by: org.apache.derby.client.am.SqlException: Schema 'ADMIN' does not exist
>       at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source)
>      ...
>      FINE: JAAS authentication aborted.
>      WARNING: Web login failed: Login failed: javax.security.auth.login.LoginException: Security Exception
>      FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization
>      FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission /error.xhtml GET)
>      FINE: [Web-Security] hasUserDataPermission isGranted: true
>      WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context 
> /CHAPTER_12_x_Container_Managed_Authentication_and_Authorization, 
> because request parameters have already been read, or 
> ServletRequest.getReader() has already been called

Обновление 4

Я изменил база данных, она была неправильно организована, поэтому я внес некоторые изменения в свои объекты:

@Entity
    @Table(name="USERS", schema="ADMIN")
    public class User implements Serializable {

        private static final long serialVersionUID = -1244856316278032177L;
        @Id 
        @Column(nullable = false)
        private String userid;  

        @Column(nullable = false)
        private String password;

        @ManyToOne
        @JoinTable(name="USER_GROUP",schema="ADMIN", joinColumns = @JoinColumn(name="userid", referencedColumnName="userid"), inverseJoinColumns=@JoinColumn(name="groupid", referencedColumnName= "groupid") )
        private Group group;
        //GET & SET METHODS

@Entity @ Table (name = "GROUPS", schema = "ADMIN") группа открытого класса реализует Serializable {

private static final long serialVersionUID = -7274308564659753174L;
@Id
@Column(nullable = false)
private String groupid;

@OneToMany(mappedBy="group")
private Set users;

// МЕТОДЫ ПОЛУЧЕНИЯ И УСТАНОВКИ

Так что мне также пришлось редактировать DBRealm, теперь это выглядит так:

enter image description here

Но когда я вхожу в систему, я снова получаю исключение:

FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization
FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission /j_security_check POST)
FINE: [Web-Security] hasUserDataPermission isGranted: true
FINE: Logging in user [user@gmail.com] into realm: DBRealm using JAAS module: jdbcRealm
FINE: Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule
SEVERE: SEC1111: Cannot load group for JDBC realm user [user@gmail.com].
FINE: Cannot load group
java.sql.SQLSyntaxErrorException: Column 'USERID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE  statement then 'USERID' is not a column in the target table.
....
....
Caused by: org.apache.derby.client.am.SqlException: Column 'USERID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE  statement then 'USERID' is not a column in the target table.
    at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source)
....
....
FINE: JAAS login complete.
FINE: JAAS authentication committed.
FINE: Password login succeeded for : user@gmail.com
FINE: permission check done to set SecurityContext
FINE: Set security context as user: user@gmail.com
FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization
FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission  GET)
FINE: [Web-Security] hasUserDataPermission isGranted: true
FINE: permission check done to set SecurityContext
FINE: SecurityContext: setCurrentSecurityContext method called

FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization
FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission /adminpanel.xhtml GET)
FINE: [Web-Security] hasUserDataPermission isGranted: true
FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization
FINE: [Web-Security] Generating a protection domain for Permission check.
FINE: [Web-Security] Checking with Principal : user@gmail.com
FINE: [Web-Security] Checking with Principal : visitors
FINE: [Web-Security] Checking with Principal : users
FINE: [Web-Security] Checking with Principal : administrators
FINE: [Web-Security] Codesource with Web URL: file:/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization
FINE: [Web-Security] Checking Web Permission with Principals : user@gmail.com, visitors, users, administrators
FINE: [Web-Security] Web Permission = (javax.security.jacc.WebResourcePermission /adminpanel.xhtml GET)
FINE: [Web-Security] hasResource isGranted: true
FINE: [Web-Security] hasResource perm: (javax.security.jacc.WebResourcePermission /adminpanel.xhtml GET)
FINE: SecurityContext: setCurrentSecurityContext method called

WARNING: Resource not found: com/sun/enterprise/v3/admin/adapter/theme/com/sun/webui/jsf/suntheme/images/masthead/masthead_button_over.gif

24
задан sfrj 2 November 2011 в 12:58
поделиться