2013-04-29 83 views
0

我无法在弹簧安全集成中发现我的问题。我已经花了2-3天了,所以请帮助我。下面无法在现有应用程序中集成弹簧安全性

是我的web.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 
    <display-name>cdl</display-name> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.htm</url-pattern> 
    </servlet-mapping> 

    <servlet> 
     <servlet-name>startUpServlet</servlet-name> 
     <servlet-class>com.qait.cdl.commons.startup.StartUpServlet</servlet-class> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>startUpServlet</servlet-name> 
     <url-pattern>/startUpServlet.htm</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
     <welcome-file>redirect.jsp</welcome-file> 
    </welcome-file-list> 

    <context-param> 
     <param-name>CDL_ENV</param-name> 
     <param-value>staging</param-value> 
    </context-param> 

    <listener> 
     <listener-class>com.qait.cdl.commons.startup.CdlContextListner</listener-class> 
    </listener> 

    <!-- Session timeout --> 
    <session-config> 
     <session-timeout>600</session-timeout> 
    </session-config> 

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

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
    WEB-INF/applicationContext.xml 
    WEB-INF/dispatcher-servlet.xml 
    </param-value> 
    </context-param> 


</web-app> 

下面是我的applicationContext.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:p="http://www.springframework.org/schema/p" 
    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.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <import resource="classapth*:spring/SpringSecurityConfig.xml" /> 
<!--  <bean name="springSecurityFilterChain" class="org.springframework.web.filter.OncePerRequestFilter"/> --> 
</beans>  

下面是我SpringSecurityConfig.xml

HTTP://www.springframework。 org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd“>

012下面
<security:http auto-config="true" use-expressions="true"> 
    <security:intercept-url pattern="/displayAdminPage.htm" access="hasRole('ROLE_ADMIN')" /> 

    <security:form-login login-page="/login.htm" authentication-failure-url="/login.htm"/> 
    <security:logout logout-url="/logout.htm" logout-success-url="/login.htm"/> 
    <security:access-denied-handler error-page="/login.htm" /> 
</security:http> 

<security:authentication-manager> 
    <security:authentication-provider user-service-ref="userService" > 
    </security:authentication-provider> 
</security:authentication-manager> 

是我的调度员servlet.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:p="http://www.springframework.org/schema/p" 
    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.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- Message resource --> 
    <bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource"> 
     <property name="basenames"> 
      <list> 
       <value>messages</value> 
       <value>error</value> 
      </list> 
     </property> 
    </bean> 

    <!-- Imports all configuration files --> 
    <import resource="classpath*:spring/*.xml" /> 
    <import resource="classpath*:spring/*/*.xml" /> 

    <!-- Interceptor mapping --> 
    <bean id="handlerMapping" 
     class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> 
     <!-- <property name="interceptors" ref="cdlInterceptor" /> --> 
     <property name="interceptors" ref="cdlSessionInterceptor"></property> 
    </bean> 

    <!-- Tiles view resolver and configuration --> 
    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.tiles2.TilesView" /> 
     <property name="order" value="1" /> 
    </bean> 

    <bean id="tilesConfigurer" 
     class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/tiles-defs.xml</value> 
      </list> 
     </property> 
    </bean> 

    <!-- XmlView Resolver --> 
    <bean class="org.springframework.web.servlet.view.XmlViewResolver"> 
     <property name="location" value="/WEB-INF/spring-Xmlviews.xml" /> 
     <property name="order" value="0" /> 
    </bean> 

    <!-- MultipartResolver for file upload --> 
    <bean id="multipartResolver" 
     class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> 

    <bean id="rssViewer" class="com.qait.cdl.rssfeed.view.CustomRssViewer" /> 

    <!-- Default view resolver mapping <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property 
     name="suffix"> <value>.jsp</value> </property> <property name="order" value="1" 
     /> </bean> --> 
</beans> 

我有以下查询。

  1. 是否有必要在web.xml中添加“filter”标记,如果是,那么为什么?
  2. 在我的应用程序中,我有两个应用程序上下文(一个用于spring security和另一个用于dispatcher-servlet),springSecurityConfig.xml是否可以访问在dispatcher-servlet.xml中定义的bean定义?
  3. 什么是弹簧安全配置的流程。根据我的了解,我了解到拦截url标签拦截请求并使用表达式语言检查适当的角色。我无法理解它在外观上的合适角色DB通过我提供的身份验证管理器。
下面

在service.xml中

<bean name="userService" class="com.qait.cdl.services.impl.UserServiceImpl"> 
      <property name="userDao" ref="userDao" /> 
     </bean> 
下面

我userService bean定义是userService接口

public interface UserService extends UserDetailsService{ 
} 

这个UserDetailsS​​ervice的是springframework的

下面

是UserServiceimpl类

public class UserServiceImpl implements UserService { 
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { 
     UserDetails userDetails = null; 
     if(username != null && !"".equals(username)){ 
      User user = userDao.get(username); 
      if(user != null){ 
       UserGroupAuthority groupAuthority = userDao.getUserAuthority(user); 
       if(groupAuthority != null){ 
        Collection<GrantedAuthority> grantedAuthorities = getGrantedAuthorities(groupAuthority.getAuthority()); 
        userDetails = new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), 
          true, true, true, true, grantedAuthorities); 
       } 
      } 
     } 
     return userDetails; 
    } 

    @Override 
    public Collection<GrantedAuthority> getGrantedAuthorities(String authority) { 
     List<GrantedAuthority> grantedAuthorities = new LinkedList<GrantedAuthority>(); 
     grantedAuthorities.add(new GrantedAuthorityImpl("ROLE_USER")); 
     return grantedAuthorities; 
    } 

    @Override 
    public UserGroupAuthority getUserAuthority(User user) { 
     return userDao.getUserAuthority(user); 
    } 
} 

简单的问题是,它没有验证给定的拦截url。我在哪里做错了?

+0

为什么你的'springSecurityFilterChain'在'web.xml'中被禁用? – 2013-04-29 11:50:11

+0

是否有必要给“springSecurityFilterChain”,因为我认为/*拦截所有传入的请求。但我不想那样。所以,我没有评论该代码 – ved 2013-04-29 11:53:20

回答

0

激活springSecurityFilterChain在您的web.xml。这是Spring Security的入口点。如果springSecurityFilterChain被停用,那么Spring Security将无法工作。

+0

,但为什么在互联网上到处都有标签/*。激活springSecurityFilterChain后,此标记 – ved 2013-04-29 12:01:10

+0

的意义是什么,它正在工作,它也在拦截url,但问题在于它调用hasRole('ROLE_ADMIN')方法时。 并且当更新我springsecurityconfig文件到低于文件 <安全:HTTP自动配置= “真” 的使用表达式= “真”> \t \t <安全:截距-URL模式= “/ displayAdminPage.htm” \t访问=“hasRole('ROLE_ADMIN')”/> \t 这是显示弹簧的默认jsp页面的用户名和密码。我不希望这样,这不是我想的好方式,因为用户已经输入用户名和密码,为什么这是再次询问 – ved 2013-04-29 12:10:06

+0

/* url-pattern意味着这个过滤器将在每个请求期间被调用。但这并不意味着每个响应都将由这个过滤器自己准备。过滤器实际上会做很多工作(例如,检查登录的用户是否有权打开实际的URL)。实际请求将由相应的servlet /控制器准备。 – 2013-04-29 12:10:29