在Spring 3 MVC Web应用程序中实现授权/访问控制的最佳方法是什么?

哥们,

我将开发一个使用Spring 3 MVC作为Web框架的Web应用程序,Hibernate Annotations作为ORM框架但是,我面临着为这个应用程序设计一个基于数据库的良好访问控制的问题.在我的工作中,我们习惯于这样设计:

>(CompanyName)User.java – 表示系统中用户的类
> Profile.java – 一个类,表示系统中与(CompanyName)User建立N-N关系的ROLE.使用ROLE,我的意思是一个用户组,如(ADMIN,ANONYMOUS,CUSTOMER SERVICE USER等)
> UserProfile.java – 表示用户与配置文件之间关系的类.它表示数据库中N-N关系的JOIN TABLE.
> Module.java – 一个类,表示Web应用程序中的MODULE.每个模块都由无限的功能组成,但每个功能只能与一个MODULE相关.例如,USER AUTHENTICATION功能与SECURITY或AUTHENTICATION模块相关.模块是使用@Controller标记的应用程序中的控制器.
> Feature.java – 表示应用程序中的FEATURE的类.每个功能都由一个或多个操作组成.例如,用户管理是一个功能.因此,它由许多操作组成(例如CREATE,READ,UPDATE和DELETE USER).此外,FEATURE有一个ENTRY URL,表示该功能的URL(用于在单击按钮/链接时将用户重定向到该功能).每个URL都映射到模块(Controller)中的方法.
> Operation.java – 表示Web应用程序中的OPERATION的类.操作基本上是单个/基本操作,例如REGISTER USER或REMOVE USER,但不一定是CRUD操作.每个操作都有一个ENTRY URL(显示开始操作的页面的URL).例如,对于USER REGISTRATION操作,条目URL将是/ webapplicationName / moduleName(USER)/ featureName(USER MANAGEMENT)/ operationName(REGISTER USER).但是操作可能需要页面流才能完成.例如,USER REGISTRATION操作可能需要一个带有注册表单的页面,一个URL(通常映射到一个方法)作为提交表单的操作和一个SUCCESS / ERROR页面,以显示SUCCESS / ERROR消息.
> Permission.java – 表示系统中URL的类.每个权限与1个或多个OPERATIONS(Operation.java)相关,以组成PAGE FLOW.例如:USER REGISTRATION操作可能具有以下URL / PERMISSIONS:

> / webapplicationName / moduleName(USER)/ featureName(USER MANAGEMENT)/ operationName(USER REGISTRATION)/ register – 映射到(CompanyNameUser)Controller中的方法的URL,用于提交表单(表单操作)并通常保存在数据库中调用(CompanyNameUser)DAO
> / webapplicationName / moduleName(USER)/ featureName(USER MANAGEMENT)/ operationName(REGISTER USER)/ success / – 映射到Controller中的方法以显示SUCCESS MESSAGE的URL
> / webapplicationName / moduleName(USER)/ featureName(USER MANAGEMENT)/ operationName(REGISTER USER)/ error / – 映射到Controller中的方法以显示错误消息的URL

> ProfilePermission.java – 表示配置文件和权限之间的N-N关系的JOIN TABLE的类.

这里的问题是,如果我使用Spring Security实现访问控制,我注定要实现一个User.java类(我不能自定义名称),我也需要一个ROLES类和一个用于AUTHORITIES的类.所以,我无法建立自己的访问控制流程.我想过使用SERVLET FILTER来检查权限接受/拒绝访问.但是,当我尝试重定向到URL或只是在我的过滤器中执行chain.doFilter()时,它只显示ERROR 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>

根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>

的servlet上下文:

    <?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实现我自己的自定义进程?我应该在处理程序映射中使用拦截器而不是使用过滤器吗?我将不胜感激任何帮助/建议.

提前致谢!

最佳答案 看看
Apache Shiro.它可能更适合您的要求.

点赞