ZK + Spring Framework + HibernateにSpring Securityをデプロイする:パート1

すべての良い一日。 約束どおり、 ZK Frameworkで作成されたWebアプリケーションのセキュリティのトピックを強調してみます 。 なぜパート1なのですか? この記事では、jspページを認証ページとして使用してSpring Securityを実装するための最速かつ最も簡単な方法を示します。 後続の記事では、zulを認証ページの構築として使用して、より複雑で興味深い方法を説明します。

Webアプリケーションをゼロから作成するのではなく、このトピックで説明した過去のアプリケーションを基礎としてください。

必要なもの:

このメソッドは、ユーザー、パスワード、および権限をSpring Security xml構成に保存するか、データベースに保存するなど、さまざまな方法で実装することもできます。 このアプリケーションはすでにOracleデータベースと連携しているため、ユーザーはデータベースに保存されません。 springのドキュメントが示すように、デフォルトの展開中に、Spring Securityは2つのテーブル(ユーザーと機関)のデータベースを調べます。 グループポリシーでは、groups、group_authorities、group_membersなどのテーブルの存在が必要です( ここからテーブルスクリプトを取得できます )。



したがって、データベースに次の形式の2つのテーブルを作成します。



CREATE TABLE users ( username varchar2 (50) NOT NULL PRIMARY KEY, password varchar2 (50) NOT NULL, enabled number NOT NULL );
      
      









 CREATE TABLE authorities ( username varchar2 (50) NOT NULL, authority varchar2 (50) NOT NULL, CONSTRAINT fk_authorities_users FOREIGN KEY (username) REFERENCES users (username) ); CREATE UNIQUE INDEX ix_auth_username ON authorities (username, authority);
      
      





次のステップは、Spring Securityを構成することです。 spring-config.xmlファイルで、次の変更を行います

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:security="http://www.springframework.org/schema/security" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <context:annotation-config /> <context:component-scan base-package="com.sample" /> <tx:annotation-driven transaction-manager="txManager" /> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/taskdb</value> </property> </bean> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="dataSource" ref="dataSource" /> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.show_sql">false</prop> <!--<prop key="hibernate.hbm2ddl.auto">update</prop> --> </props> </property> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> <property name="configLocation" value="/WEB-INF/hibernate.cfg.xml" /> </bean> <!-- Configure the Spring Security --> <security:global-method-security secured-annotations="enabled" jsr250-annotations="enabled" />
      
      







  <security:http auto-config="true"> <!-- Don't set any role restrictions on login.jsp --> <security:intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <!-- Restrict access to ALL other pages --> <security:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" /> <security:form-login login-page="/login.jsp" default-target-url="/index.zul" always-use-default-target="true" authentication-failure-url="/login.jsp?login_error=1" /> <security:logout logout-url="/j_spring_security_logout" invalidate-session="true" logout-success-url="/logoutSuccess.jsp" /> </security:http> <!-- Configure the authentication provider --> <security:authentication-manager> <security:authentication-provider> <security:jdbc-user-service data-source-ref="dataSource" /> </security:authentication-provider> </security:authentication-manager> </beans>
      
      





いくつかの点について説明します。



また、web.xmlに追加することを忘れないでください。

  <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
      
      





設定はすべて完了しました。 次に、login.jspログインページを作成します。

 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix='c' uri='http://java.sun.com/jstl/core_rt'%> <html> <head> <title> </title> <style type="text/css"> body { background: #63bad8 50% 0px repeat-x; text-align: center; } div.main { margin: 50px auto; padding: 0 0 0 0; width: 340px; border-color: black; } </style> </head> <body> <div class="main"> <h1 style="background-color: #3F3F3F; color: white; padding: 0px; margin: 0px;"></h1> <div style="background: white; border: black; padding: 0px; margin: 0px;" align="center" dir="ltr"> <c:if test="${not empty param.login_error}"> <font color="red">     .  .</font> </c:if> <form name="f" action="<c:url value='j_spring_security_check'/>" method="POST" style="background: white;"> <table> <tr> <td style="font-style: oblique">:</td> <td><input type='text' name='j_username' value='<c:if test="${not empty param.login_error}"><c:out value="${SPRING_SECURITY_LAST_USERNAME}"/></c:if>' /> </td> </tr> <tr> <td style="font-style: oblique">:</td> <td><input type='password' name='j_password'> </td> </tr> <tr align="center"> <td colspan='2' align="center"><input name="submit" value="" type="submit"> <input name="reset" value="" type="reset"> </td> </tr> </table> </form> </div> </div> </body> </html>
      
      





実行して、果物を見ることができます。

権利の差別化を試してみましょう。 たとえば、ROLE_ADMIN権限を持つユーザーのみがシステムからユーザーを削除することを許可します。 これを行うには、ユーザー削除手順の前の手順( PersonImpl )で、次のように記述します。

@RolesAllowed("ROLE_ADMIN")

public boolean delete(Person pers)







ログインしているユーザーの名前も表示します。

最初に、id = "labelLogin"のLabelコンポーネントを作成します。これは、ユーザー名とToolbarbuttonを表示するために使用され、ユーザー終了ボタンとして機能します。 index.zulファイル 、行<listbox id="lbPerson" hflex="1" vflex="1" checkmark="true"



に、以下を追加します。

  <toolbar> <label id="labelLogin"/> / <toolbarbutton label="" href="/j_spring_security_logout"/> </toolbar>
      
      





さて、 PersonInfoクラスのpublic void onCreate()メソッド内で、ユーザー名を表示する機能を実装します。

 UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); ((Label) this.getFellow("labelLogin")).setValue(userDetails.getUsername());
      
      





このコードでは、 UserDetailsに含まれるすべてのユーザーデータとid =“ labelLogin”のLabelコンポーネントをindex.zulフォームから取得し、ユーザー名を渡します。

次に、アプリケーションを起動して、
 http://localhost:port/NameOfProject
      
      



login.jspページに自動的にリダイレクトされたことがわかります。



All Articles