Webアプリケーションをゼロから作成するのではなく、このトピックで説明した過去のアプリケーションを基礎としてください。
必要なもの:
- ここから取得するSpring Securityライブラリ
- zk-spring-securityライブラリ
- サイトから取得した jstl
このメソッドは、ユーザー、パスワード、および権限を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>
いくつかの点について説明します。
-
<security:global-method-security
secured-annotations="enabled" jsr250-annotations="enabled" />
<security:global-method-security
secured-annotations="enabled" jsr250-annotations="enabled" />
- @RolesAllowed( "ROLE_ADMIN")という形式の注釈を使用する機会を与えます。この行は@RolesAllowed({"ROLE_ADMIN"、 "ROLE_USER"のようになります}); -
<security:intercept-url pattern="/login.jsp"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/login.jsp"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
-誰でもlogin.jspページに<security:intercept-url pattern="/login.jsp"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
できると言っています。 -
<security:intercept-url pattern="/**"
access="ROLE_ADMIN,ROLE_USER" />
<security:intercept-url pattern="/**"
access="ROLE_ADMIN,ROLE_USER" />
-すべてのページにアクセスできるのは、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:form-login login-page="/login.jsp"
default-target-url="/index.zul" always-use-default-target="true"
authentication-failure-url="/login.jsp?login_error=1" />
-正しいログイン/パスワードで、index.zulページに移動します(もちろん、このユーザーの権限で許可されている場合)。そうでない場合、エラーコードを表示します。
また、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ページに自動的にリダイレクトされたことがわかります。