230 likes | 557 Vues
Подключение базы данных. Аутоидентификация и авторизация через БД. Системы управления базами данных. H2 Derby HSQLDB MySQL PostgreSQL Oracle. Java Database Connectivity (JDBC). Платформенно-независимый механизм работы с базами данных из java Входит в состав Java SE
E N D
Подключение базы данных Аутоидентификацияи авторизация через БД
Системы управления базами данных • H2 • Derby • HSQLDB • MySQL • PostgreSQL • Oracle
JavaDatabaseConnectivity(JDBC) • Платформенно-независимый механизм работы с базами данных из java • Входит в состав Java SE • Позволяет создавать соединение с БД по специальному url • Для применения необходим соответствующий драйвер БД (драйвер часто подгружается динамически)
Пример работы с JDBC В данном случае используется драйвер для подключения к MySQL (com.mysql.jdbc.driver) Обработка результата запроса происходит в методе writeResultSet(resultSet)
Вызов функций БД через JDBC • Вызов хранимых процедур в jdbcпредполагает знание сигнатуры функции • Использование хранимых процедур позволяет отделить логику данных от логики приложения Stringprocedure="{? = call CREATE_A_PERSON (?)}"; CallableStatementstatement=conn.prepareCall(procedure); statement.registerOutParameter(1, java.sql.Types.STRUCT, "UDO_PERSON"); statement.setString(2, "YOURE NAME");statement.execute(); ResultSetresults=(ResultSet)proc.getObject(1);
Подготовка • Подключение базы данных и jvmосуществляется через специальные java классы (JDBC Driver) • Также необходимо иметь запущенную СУБД • Не забудьте скопировать JDBC Driver jar в%CATALINA_HOME%/lib
Инициализация пула подключений %PROJECT_DIR%/web/META-INF/context.xml jdbc driver jdbcurlСУБД Для MySqljdbc:mysql://localhost:3306/storage maxActive – максимальное число активных соединений в пуле maxIdel– максимальное число неактивных соединений maxWait– максимальное время ожидания соединения Значение -1 везде означает отсутствие ограничения
Подключение базы данных в приложение %PROJECT_DIR%/web/WEB-INF/web.xml Res-ref-name– должен совпадать с именем ресурса в контексте
Как достать соединение Забираем ресурс Достаём connection из пула Обязательно закрыть connection иначе весь пулл вытечет
Создание базы данных для авторизации createschemamydb; CREATETABLEmydb.users( id intNOTNULLAUTO_INCREMENT, login varchar(25)NOTNULLUNIQUE, passwordvarchar(25)notnull, PRIMARY KEY(id) ); INSERTINTO MYDB.USERS (id, LOGIN ,PASSWORD) VALUES(null,'user','pass'); INSERTINTO MYDB.USERS (id, LOGIN ,PASSWORD) VALUES(null,'user1','pass1'); INSERTINTO MYDB.USERS (id, LOGIN ,PASSWORD) VALUES(null,'user2','pass2'); select*frommydb.usersorder by login
Java Authentication and Authorization Service(JAAS) • Единая система авторизации • Введена для отделения авторизации от исходного кода приложения
Применение jaas <security-constraint> <web-resource-collection> <web-resource-name>App requires authentication</web-resource-name> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>tomcat</role-name> </auth-constraint> <user-data-constraint> <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE --> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> </login-config>
Добавление пользователей %CATALINA_HOME%\conf\tomcat-users.xml <rolerolename="tomcat"/> <userusername="tomcat"password="tomcat"roles="tomcat"/> <userusername=“user"password=“pass"roles="tomcat"/>
Авторизация через web форму <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.html</form-login-page> <form-error-page>/error.html</form-error-page> </form-login-config> </login-config>
Авторизация через БД • Соответствующим образом определить пул доступа к БД • Определить таблицы пользователей и ролей Login и Role сохраняются в сессию Data base Login page Authorization manager Application Error page
Как всё устроено сейчас Все настройки по умолчанию написаны внутри %CATALINA_HOME%/conf/service.xml Настройки ресурса с паролями и ролями: Настройки аутидентификации: <Resourcename="UserDatabase” auth="Container« type="org.apache.catalina.UserDatabase" description="Userdatabasethatcanbeupdatedandsaved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory” pathname="conf/tomcat-users.xml"/> <RealmclassName="org.apache.catalina.realm.LockOutRealm"> <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm>
Подмена ресурса и процесса аутидентификации • Все действия для конкретного приложения можнопроделать в Context.xml <Resource name="jdbc/H2db"auth="Container" type="javax.sql.DataSource" driverClassName="org.h2.Driver" url="jdbc:h2:file:/data/storage" username="sa" password="" maxActive="20"maxIdle="10"maxWait="-1" description="Datasource for store data" /> <RealmclassName="org.apache.catalina.realm.DataSourceRealm“ dataSourceName="jdbc/H2db“ • localDataSource="true" userTable="users“ userNameCol="user_name" userCredCol="user_pass“ userRoleTable="user_roles“ roleNameCol="role_name"/> http://mrhaki.blogspot.ru/2011/01/configure-jdbcrealm-in-tomcat-for.html
Роль и пользователь • Это классы реализующие интерфейс java.security.Principal publicclassRolePrincipalimplementsPrincipal{ privateStringname; publicRolePrincipal(Stringname){ this.name=name; } publicvoidsetName(Stringname){ this.name=name; } @OverridepublicStringgetName(){ returnname; } } Можно аналогично реализовать класс для пользователя
Модуль авторизации • Модуль должен реализовывать интерфейс javax.security.auth.spi.LoginModule • Для процесса авторизации интересны методы: • initialize – вызывается первым, здесь нужно сохранить ссылку на пустой объект авторизации • login – в этом методе производится проверка пароля и имени пользователя. Метод должен либо вернуть true (успешная авторизация), иначе выбросить исключение производное от javax.security.auth.login.LoginException • commit – этот метод вызывается, если login вернул true. Метод нужен для установление роли и имени пользователя в объект авторизации.
Конфигурация jaas • Необходима указать новые классы ролей и пользователя в context.xml: • Имя (appName) должно совпадать с именем в конфигурациях jaas: • Для того чтобы Tomcat подхватил конфигурации нужно указать путь к файлу: <RealmclassName="org.apache.catalina.realm.JAASRealm“ appName="WebApplication2" userClassNames="edu.jaas.UserPrincipal" roleClassNames="edu.jaas.RolePrincipal"/> WebApplication2 { edu.jaas.MyLoginModulerequireddebug=true; }; JAVA_OPTS=$JAVA_OPTS "-Djava.security.auth.login.config==$CATALINA_BASE/conf/jaas.config"
Модуль авторизации Фрагмент кода метода login,отвечающий за проверку пароля. if(this.name==null||this.name.equals(STRING_EMPTY)){ thrownewCredentialNotFoundException("User name is required"); } if(this.password==null||this.password.equals(STRING_EMPTY)){ thrownewCredentialNotFoundException("Password is required"); }try{ returncheckUser(name, password); }catch(NamingException|SQLException ex){ Logger.getLogger(MyLoginModule.class.getName()).log( Level.SEVERE, ex.getLocalizedMessage(), ex); thrownewLoginException(ex.getMessage()); } Можно проверять любым способом
Завершение сеанса (logout) • Для завершения сеанса или для того чтобы зайти в приложение под другим пользователем достаточно сбросить сессиюrequest.getSession().invalidate(); • После этого произойдёт вызов метода LoginModulelogout и принципы удаляться из объекта авторизации
Источники • www.w3schools.com/sqlANSI SQL • http://www.javacodegeeks.com/2013/02/jdbc-realm-and-form-based-authentication-with-glassfish-3-1-2-2-and-primefaces-3-4.html настройка jaasна авторизацию через БД • http://www.byteslounge.com/tutorials/jaas-authentication-in-tomcat-exampleпримеры jaasавторизации