4

仲間、

Spring 3 MVC を Web フレームワークとして使用し、Hibernate Annotations を ORM フレームワークとして使用して Web アプリケーションを開発しようとしています。私の仕事では、次のように設計することに慣れています。

  • (CompanyName)User.java -システム内のユーザーを意味するクラス

  • Profile.java - (CompanyName)UserとのNN関係 にあるシステム内のROLEを意味するクラス。ROLEとは、 (ADMIN、ANONYMOUS、CUSTOMER SERVICE USER など)などのユーザー グループを意味します。

  • UserProfile.java - UserProfileの間の関係を意味するクラス。これは、データベース内のNN関係のJOIN TABLEを表します。

  • Module.java - Web アプリケーションのMODULEを意味するクラス。各モジュールは無制限の機能で構成されていますが、各機能は 1 つのMODULEにのみ関連付けることができます。たとえば、USER AUTHENTICATION機能は、SECURITYまたはAUTHENTICATIONモジュールに関連しています。モジュールは、@Controller でタグ付けされたアプリケーション内のコントローラーです。

  • Feature.java -アプリケーションのFEATUREを表すクラス。各機能は、1 つまたは複数の操作で構成されています。たとえば、USER MANAGEMENT は FEATURE です。そのため、多くの操作 (CREATE、READ、UPDATE、DELETE USER など) で構成されています。また、FEATURE には、その機能への URL を表す ENTRY URL があります (ボタン/リンクをクリックしたときにユーザーをその機能にリダイレクトするため)。各 URL は Module(Controller) 内のメソッドにマップされます。

  • Operation.java - Web アプリケーションのOPERATIONを表すクラス。操作は、基本的にREGISTER USERREMOVE USERなどの単一/基本操作ですが、必ずしも CRUD 操作ではありません。各操作にはENTRY URL (操作を開始するページを示す URL) があります。たとえば、USER REGISTRATION操作の場合、エントリURL/webapplicationName/moduleName(USER)/featureName(USER MANAGEMENT)/operationName(REGISTER USER)になります。ただし、操作を行うにはページ フローが必要になる場合があります。たとえば、ユーザー登録操作には、登録フォームを含むページ、フォームを送信するためのアクションとしての URL (通常はメソッドにマップされる)、および成功/エラーメッセージを表示するための成功/エラーページが必要になるでしょう。

  • Permission.java - システム内のURLを表すクラス。各 Permission は、ページ フローを構成する 1 つまたは複数のOPERATIONS (Operation.java) に関連付けられています。例: USER REGISTRATION操作には、おそらく次のURL/PERMISSIONSがあります。

    • /webapplicationName/moduleName(USER)/featureName(USER MANAGEMENT)/operationName(USER REGISTRATION)/register - (CompanyNameUser)Controller 内のメソッドにマップされた URL で、フォームを送信し (フォーム アクション)、通常は呼び出しをデータベースに保持します。 a (CompanyNameUser)DAO

    • /webapplicationName/moduleName(USER)/featureName(USER MANAGEMENT)/operationName(REGISTER USER)/success/ - 成功メッセージを表示するためにコントローラーのメソッドにマップされた URL

    • /webapplicationName/moduleName(USER)/featureName(USER MANAGEMENT)/operationName(REGISTER USER)/error/ - エラーメッセージを表示するためにコントローラーのメソッドにマップされた URL

  • ProfilePermission.java - プロファイルと権限の間の NN 関係の JOIN TABLE を表すクラス。

ここでの問題は、Spring Security を使用してアクセス制御を実装する場合、User.java クラスを実装する運命にあり (名前をカスタマイズできません)、ROLES 用のクラスや AUTHORITIES 用のその他のクラスも必要になることです。そのため、独自のアクセス制御フローを構築できません。SERVLET FILTER を使用してアクセス許可の許可/拒否を確認することを考えました。ただし、URL にリダイレクトしようとしたり、フィルター内で chain.doFilter() を実行したりすると、エラー 404 が表示されます。これは、 DefaultAnnotationHandlerMappingを使用してリクエストを処理しているためだと思います。つまり、私の構成は次のとおりです。

web.xml:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" 
   xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">`<display-name>cheapig</display-name>

<!-- ROOT CONTEXT DEFINITIONS -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>`
<listener>
    <listener-  class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 

<!-- The filter to implement my access control -->
<filter>
    <filter-name>securityFilter</filter-name>
    <filter-class>org.cheapig.security.SecurityFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>securityFilter</filter-name>
  <url-pattern>/**</url-pattern>
</filter-mapping>   

<servlet>
    <servlet-name>cheapig</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-   class>     <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/cheapig/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>  

<servlet-mapping>
    <servlet-name>cheapig</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping></web-app>

root-context.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:aop="http://www.springframework.org/schema/aop"       
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:context="http://www.springframework.org/schema/context"       
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/aop       
    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="latin1"/>              
</bean>

<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang" />      
</bean>

<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="pt"/>

</bean>

<bean id="handlerMapping"
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
   <property name="interceptors">
       <ref bean="localeChangeInterceptor" />
   </property>     
</bean></beans>

サーブレット コンテキスト:

    <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
    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">

    <!-- DispatcherServlet Context: defines this servlet's request-processing   infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Imports user-defined @Controller beans that process client requests -->
    <beans:import resource="controllers.xml" />
    <beans:import resource="hibernateMySQL5.xml"/>      
    <context:component-scan base-package="br.com.cheapig" />
</beans:beans>

SecurityFilter.java:

package br.com.cheapig.security;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SecurityFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    // TODO Auto-generated method stub
    chain.doFilter(request, response);
}

@Override
public void destroy() {
    // TODO Auto-generated method stub
}
 }

それで、私は何をすべきですか?Spring Security を使用する必要がありますか? Spring Security で独自のカスタム プロセスを実装する方法はありますか? フィルターを使用する代わりに、ハンドラー マッピングでインターセプターを使用する必要がありますか? ヘルプ/提案をいただければ幸いです。

前もって感謝します!

4

2 に答える 2

2

Apache Shiroを見てください。それはあなたの要件により適しているかもしれません。

于 2012-04-01T17:47:33.783 に答える