Я хочу понять безопасность на основе форм и области 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...
}
Когда БД была готова, я добавил некоторые данные вручную
Следующим шагом было для настройки области безопасности.
Затем добавил конфигурацию безопасности в мой файл 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 вместо простой формы, когда я реализую вход в систему?
Я очень признателен за помощь, я уже несколько часов читал первые главы книги и пытаюсь реализовать свой пример, но я застрял. Думаю, я близок к решению.
Обновление
Я изменил принципала по умолчанию на имя пользователя посетителей. Но это все еще не работает
И я также добавил еще несколько параметров в свою конфигурацию Realm
Но когда я пытаюсь войти в систему, я все еще вижу исключение, которое говорит:
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 }} Вот как выглядит мой пул соединений:
У меня мало свойств, может чего-то не хватает?
Также теперь я создал ресурс JDBC, который выглядит так:
(Имя 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, теперь это выглядит так:
Но когда я вхожу в систему, я снова получаю исключение:
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