`
kingxss
  • 浏览: 973840 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring Security3实践总结

阅读更多

        在线项目最近要对管理系统进行细粒度的权限控制,细化到URL级别。Spring Security3在这个时候引入到了系统总来。Spring Security3的学习曲线并不是非常的平坦。现在将使用场景和使用方法总结如下。

一、需求

       做项目肯定要从项目背景和需求谈起。这个在线项目的背景和需求如下:

  1. 该项目为一个对外网开发的管理系统,系统功能丰富,需要将系统的功能进行切分,不同用户拥有不同的权限。该系统为JAVA开发,使用了Spring3。
  2. 权限的粒度细化到最小功能级别。
  3. 根据用户权限展现菜单。
  4. 根据用户权限显示每个页面的功能按钮等。
  5. 用户必须登录才能操作。
  6. 系统有超级管理员,其拥有最大的权限,可以操作任何功能。
  7. 系统存在公共页面,登录用户均可查看和使用。

二、方案

       有了需求肯定就要有解决方案,针对上面的背景和需求。我们的解决方案和办法如下:

  1. 既然已经用了Spring3,那就直接上Spring Security3,这里为了保证和系统版本统一,使用3.1.2.RELEASE。
  2. URL请求就是最小的用需要的最小权限粒度对应物,所以将URL作为Spring Security中的资源。
  3. 根据用户权限情况加载用户菜单树。
  4. 获取登陆用户的资源权限,来展现页面功能按钮。SpringSecurity有标签可以控制资源的显示,由于本文涉及的项目中需要向下兼容,而且存在白名单,所以做了自定义标签处理。
  5. 增加用户操作拦截,判定用户登陆状态。
  6. 增加用户白名单来实现超级管理员操作权限最大化,实质是登陆的超级管理员用户不需要过Spring Security的资源授权功能。
  7. 增加公共资源白名单,使任何登陆用户均可访问公共页面,实质是在用户已经登陆的情况下公共资源不需要过Spring Security的资源授权功能。

 Spring Security3对(用户登录)验证和(安全资源)授权的基本流程如下图:

 SpringSecurity3验证和授权流程图

注意:第5步的白名单是自定义操作。

 

三、实现

      使用Spring Security3的实践过程如下:

 

  1. 增加Spring Security3的MAVEN坐标依赖:

<!-- Spring Security Start -->
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
  <version>3.1.2.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-taglibs</artifactId>
  <version>3.1.2.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-core</artifactId>
  <version>3.1.2.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-config</artifactId>
  <version>3.1.2.RELEASE</version>
</dependency>
<!-- Spring Security End -->

 

 2. 设置项目的web.xml,Spring Security3的过滤器:

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

  

3. 增加applicationContext-security.xml,整体配置在附件代码中。

 

    3.1) 验证管理器配置,用户登陆的时候进行的验证,这里采用JDBC的模式,如果不用开启hideUserNotFoundExceptions,则可以采用简单的标签配置。

<!-- 认证管理器.用户登陆认证的入口, 加载用户角色。 -->
<authentication-manager alias="authenticationManagerBean">
 <authentication-provider ref="authenticationProvider">
  <!-- <jdbc-user-service data-source-ref="dataSource" 
	users-by-username-query="" 
	authorities-by-username-query="" />
  <password-encoder base64="true" hash="sha-256" /> -->
 </authentication-provider>
</authentication-manager>

<b:bean id="authenticationProvider" 
 class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
 <b:property name="userDetailsService" ref="userDetailsService" />
 <b:property name="hideUserNotFoundExceptions" value="false" />
 <b:property name="passwordEncoder" ref="passwordEncoder" />
 <!-- 加密的加盐处理,当然存储的密码也是加盐了,加盐后的被加密串格式:password{salt} 。 -->
 <!--
 <b:property name="saltSource">
  <b:bean class="org.springframework.security.authentication.dao.ReflectionSaltSource">
   <b:property name="userPropertyToUse">username</b:property>
  </b:bean>
 </b:property>
 -->
</b:bean>

<b:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
 <b:property name="dataSource" ref="dataSource" />
 <b:property name="usersByUsernameQuery" 
   value="SELECT username, password, enable FROM user WHERE username=? AND enable=true;" />
 <b:property name="authoritiesByUsernameQuery" 
   value="SELECT u.username username, r.rolename rolename FROM user u, role r, 
   user_role ur WHERE u.username=? AND u.id = ur.user_id AND ur.role_id = r.id;" />
</b:bean>

<!-- 用户的密码加密方式 -->
<b:bean id="passwordEncoder" 
 class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
 <b:constructor-arg index="0" value="256" />
 <b:property name="encodeHashAsBase64" value="true" />
</b:bean>

 

    3.2) 授权流程中安全资源加载器和决策器的配置:

<!-- 访问决策器,决定某个用户(具有的角色)是否有足够的权限去访问某个资源 -->
<b:bean id="accessDecisionManagerBean" 
	class="demo.security.CustomizedAccessDecisionManager" >
 <!-- 没有显式定义的资源都保护起来。该属性默认值为false -->
 <b:property name="allowIfAllAbstainDecisions" value="false"/>
</b:bean>

<!-- 安全资源定义,即定义某一安全资源可以被哪些角色访问 -->
<b:bean id="securityMetadataSourceBean" 
	class="demo.security.CustomizedInvocationSecurityMetadataSource">
 <b:constructor-arg index="0" ref="commonDao" />
 <b:property name="rejectPublicInvocations" value="true" />
</b:bean>

 

    3.3) 指定过滤器,作为验证和授权的自定义处理入口

<!-- 一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性 --> 
<b:bean id="customizedFilter" class="demo.security.CustomizedFilterSecurityInterceptor">
 <b:property name="authenticationManager" ref="authenticationManagerBean" />
 <b:property name="accessDecisionManager" ref="accessDecisionManagerBean" />
 <b:property name="securityMetadataSource" ref="securityMetadataSourceBean" />
</b:bean>

 

    3.4) 同时增加异常处理配置,针对验证过程中的异常记性处理

<!-- 认证异常处理 -->
<b:bean id="exceptionMappingAuthenticationFailureHandler" 
	class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
 <b:property name="exceptionMappings">
  <b:map>
   <!-- 用户不存在 -->
   <b:entry key="org.springframework.security.core.userdetails.UsernameNotFoundException"  
	value="/login.jsp?sign=No User" />
   <!-- 凭证错误(密码不正确) -->
   <b:entry key="org.springframework.security.authentication.BadCredentialsException"  
	value="/login.jsp?sign=Bad Credentials" />
   <!-- 用户不可用	 -->
   <b:entry key="org.springframework.security.authentication.DisabledException"  
	value="/login.jsp?sign=User is disabled" />
   <!-- 登陆凭证错误	 -->
   <b:entry key="org.springframework.security.core.AuthenticationException"  
	value="/login.jsp?sign=Authentication Failure" />
  </b:map>
 </b:property>
</b:bean>

 

    3.5) 现在将上述的整体将上述配置整体配置到SpringSecurity3的过滤器链中:

<!-- 当访问被拒绝时,会转到403.jsp -->
<http access-denied-page="/WEB-INF/error/403.jsp" pattern="/*.htm*">
  <!-- 登陆设置 -->
  <form-login login-page="/login.jsp" username-parameter="loginName" 
    password-parameter="password" login-processing-url="/login.htm"
    authentication-failure-url="/login.jsp?sign=BadCredentials" 
	default-target-url="/index.htm" always-use-default-target="true" 
    authentication-failure-handler-ref="exceptionMappingAuthenticationFailureHandler" />
  <!-- 匿名用户访问控制,这里设置不允许匿名用户登陆 -->
  <anonymous enabled="false" />
  <!-- 登出设置 -->
  <logout logout-success-url="/login.jsp" logout-url="/logout.htm" />
  <http-basic />
  <!-- 增加一个filter,位于FILTER_SECURITY_INTERCEPTOR之前 -->
  <custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="customizedFilter" />
</http>

 

    3.6) 同时增加自身项目需要白名单设置:

<!-- 安全资源白名单(URL) -->
<b:bean id="securityMetadataSourceTrustListHolder" 
	class="demo.security.util.SecurityMetadataSourceTrustListHolder" >
	<b:property name="trustList">
		<b:list>
			<b:value>/index.htm</b:value>
			<b:value>/hello.htm</b:value>
		</b:list>
	</b:property>
</b:bean>

<!-- 安全用户白名单 -->
<b:bean id="securityUserTrustListHolder" 
	class="demo.security.util.SecurityUserTrustListHolder" >
	<b:property name="trustList">
		<b:list>
			<b:value>administrator</b:value>
		</b:list>
	</b:property>
</b:bean>

 

    3.7) 开启SpringSecurity3日志:

<!-- 开启Spring Security3认证和授权日志 -->
<b:bean class="org.springframework.security.authentication.event.LoggerListener"/>
<b:bean class="org.springframework.security.access.event.LoggerListener"/>

 

  4. 自定义拦截器代码。最核心的代码就是invoke方法中的InterceptorStatusToken token = super.beforeInvocation(fi);这一句,即在执行doFilter之前,进行权限的检查,而具体的实现已经交给accessDecisionManager了。

/**
 * 权限拦截器
 * 
 * @author Watson Xu
 * @since 1.0.7 <p>2013-7-10 下午4:12:18</p>
 */
public class CustomizedFilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {

	private FilterInvocationSecurityMetadataSource securityMetadataSource;
	private static Log logger = LogFactory.getLog(CustomizedFilterSecurityInterceptor.class);

	// ~ Methods
	// ========================================================================================================

	/**
	 * Method that is actually called by the filter chain. Simply delegates to
	 * the {@link #invoke(FilterInvocation)} method.
	 * 
	 * @param request  the servlet request
	 * @param response   the servlet response
	 * @param chain  the filter chain
	 * @throws IOException   if the filter chain fails
	 * @throws ServletException if the filter chain fails
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//@1
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		HttpServletResponse httpResponse = (HttpServletResponse)response;
		String url = httpRequest.getRequestURI().replaceFirst(httpRequest.getContextPath(), "");
		
		//	1.1)判断登陆状态:如果未登陆则要求登陆
		if(!SessionUserDetailsUtil.isLogined()) {
			httpResponse.sendRedirect(httpRequest.getContextPath() + SecurityConstants.LOGIN_URL);
			logger.info("未登陆用户,From IP:" + SecutiryRequestUtil.getRequestIp(httpRequest) + "访问 :URI" + url);
			return;
    	}
		
		//	1.2)过用户白名单:如果为超级管理员,则直接执行
		if(SecurityUserTrustListHolder.isTrustUser(SessionUserDetailsUtil.getLoginUserName())) {
			chain.doFilter(request, response);
			return;
		}
		
		//	1.3)过资源(URL)白名单:如果为公共页面,直接执行
		if(SecurityMetadataSourceTrustListHolder.isTrustSecurityMetadataSource(url)){
			chain.doFilter(request, response);
			return;
		}
		
		FilterInvocation fi = new FilterInvocation(request, response, chain);
		invoke(fi);
	}

	public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() {
		return this.securityMetadataSource;
	}

	public Class<? extends Object> getSecureObjectClass() {
		return FilterInvocation.class;
	}

	public void invoke(FilterInvocation fi) throws IOException,
			ServletException {
		//@2,进行安全验证
		InterceptorStatusToken token = null;
		try {
			token = super.beforeInvocation(fi);
		} catch (IllegalArgumentException e) {
			HttpServletRequest httpRequest = fi.getRequest();
			HttpServletResponse httpResponse = fi.getResponse();
			String url = httpRequest.getRequestURI().replaceFirst(httpRequest.getContextPath(), "");
			logger.info("用户 " + SessionUserDetailsUtil.getLoginUserName() + ",From IP:" + SecutiryRequestUtil.getRequestIp(httpRequest) + "。尝试访问未授权(或者) URI:" + url);
			
			httpResponse.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
            RequestDispatcher dispatcher = httpRequest.getRequestDispatcher(SecurityConstants.NOT_ACCEPTABLE);
            dispatcher.forward(httpRequest, httpResponse);
			return;
		}
		
		try {
			fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
		} finally {
			super.afterInvocation(token, null);
		}
	}

	public SecurityMetadataSource obtainSecurityMetadataSource() {
		return this.securityMetadataSource;
	}

	public void setSecurityMetadataSource(
			FilterInvocationSecurityMetadataSource newSource) {
		this.securityMetadataSource = newSource;
	}

	@Override
	public void destroy() {
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}

}

 

  5. 自定义资源的访问权限的定义加载器

/**
 * 安全资源(URL)和角色映射关系处理器
 * 
 * @author Watson Xu
 * @since 1.0.7 <p>2013-7-9 下午3:25:09</p>
 */
public class CustomizedInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
	
	private boolean rejectPublicInvocations = false;
	private CommonDao dao;

	private static Map<String, Integer> resources = new HashMap<String, Integer>();
	
	public CustomizedInvocationSecurityMetadataSource(CommonDao dao) {
		this.dao = dao;
		loadSecurityMetadataSource();
	}
	
	// According to a URL, Find out permission configuration of this URL.
	// 根据URL来查找所有能够访问该资源的角色。
	public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
		// guess object is a URL.
		//@3
		String url = ((FilterInvocation)object).getRequestUrl();
		
		if(resources.isEmpty()) return null;
		Integer resourceId = resources.get(url);
		if(rejectPublicInvocations && resourceId == null) {
			throw new IllegalArgumentException("Secure object invocation " + object +
                    " was denied as public invocations are not allowed via this interceptor. ");//请求不存在
		}
		return getRolesByResouceId(resourceId);
	}

	private Collection<ConfigAttribute> getRolesByResouceId(Integer resourceId) {
		List<String>  roles = dao.getRoleByResourceId(resourceId);
		
		Collection<ConfigAttribute> atts = null;
		if(roles != null) {
			atts = new ArrayList<ConfigAttribute>();
			for (String role : roles) {
				atts.add(new SecurityConfig(role));
			}
		}
		
		return atts;
	}
	
	//加载所有安全资源(URL)
	private void loadSecurityMetadataSource() {
		List<Map<String, Object>> resourceDtos = dao.getAllResource();
		if(resourceDtos != null) {
			resources.clear();
			for (Map<String, Object> dto : resourceDtos) {
				resources.put(dto.get("url").toString(), Integer.parseInt(dto.get("id").toString())); 
			}
		}
	}
	
	public boolean supports(Class<?> clazz) {
		return true;
	}
	
	public Collection<ConfigAttribute> getAllConfigAttributes() {
		return null;
	}

	public void setDao(CommonDao dao) {
		this.dao = dao;
	}

	public void setRejectPublicInvocations(boolean rejectPublicInvocations) {
		this.rejectPublicInvocations = rejectPublicInvocations;
	}

}
   6. 自定义决策器。在这个类中,最重要的是decide方法,如果不存在对该资源的定义,直接放行;否则,如果找到正确的角色,即认为拥有权限,并放行,否则throw new AccessDeniedException("no right");这样,就会进入上面提到的403.jsp页面。
/**
 * 安全资源(URL)权限决策器
 * 
 * @author Watson Xu
 * @since 1.0.7 <p>2013-7-10 下午4:08:42</p>
 */
public class CustomizedAccessDecisionManager implements AccessDecisionManager {

	private boolean allowIfAllAbstainDecisions = false;
	
    public boolean isAllowIfAllAbstainDecisions() {
        return allowIfAllAbstainDecisions;
    }

    public void setAllowIfAllAbstainDecisions(boolean allowIfAllAbstainDecisions) {
        this.allowIfAllAbstainDecisions = allowIfAllAbstainDecisions;
    }

    protected final void checkAllowIfAllAbstainDecisions() {
        if (!this.isAllowIfAllAbstainDecisions()) {
            throw new AccessDeniedException("Access is denied");
        }
    }
    
	//In this method, need to compare authentication with configAttributes.
	// 1, A object is a URL, a filter was find permission configuration by this URL, and pass to here.
	// 2, Check authentication has attribute in permission configuration (configAttributes)
	// 3, If not match corresponding authentication, throw a AccessDeniedException.
	
	//这里的三个参数可以片面的理解为: 用户登录后的凭证(其中包含了用户名和角色的对应关系)、请求的URL、请求的URL对应角色(这些角色可以访问这些URL)
	public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
			throws AccessDeniedException, InsufficientAuthenticationException {
		//@4
		if(configAttributes == null){
			return;
		}
		
		Iterator<ConfigAttribute> ite=configAttributes.iterator();
		while(ite.hasNext()){
			ConfigAttribute ca=ite.next();
			String needRole=((SecurityConfig)ca).getAttribute();
			for(GrantedAuthority ga:authentication.getAuthorities()){
				if(needRole.equals(ga.getAuthority())){  //ga is user's role.
					return;
				}
			}
		}
		
		checkAllowIfAllAbstainDecisions();
	}

	@Override
	public boolean supports(ConfigAttribute attribute) {
		return true;
	}

	@Override
	public boolean supports(Class<?> clazz) {
		return true;
	}


}

 

  6. 其他工具类代码这不做赘述,具体可以参考附件中的工程代码。

 

参考:

  1. Spring Security官方文档:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity.html
  2. 官方文档中文翻译:http://www.mossle.com/docs/springsecurity3/html/springsecurity.html
  3. 入门教程:http://www.blogjava.net/fastzch/archive/2013/05/02/315028.html
  4. 更多的自定义选择:http://blog.csdn.net/shadowsick/article/details/8576449

 

分享到:
评论
14 楼 wabiaozia 2015-11-12  
很实用,谢谢
13 楼 zuo_huai 2014-03-17  
kingxss 写道
zuo_huai 写道
你好,我也有这样的需求,能不能把表的设计也公布一下

你好,具体表结构你可以参考附件中DataSourcePopulator.java类中对数据库中数据初始化方法init()中的内容。从几个表的名字就可以看出数据库的表模型。谢谢!

哈哈……,经过一段努力,把你的程序,改写了一下
12 楼 kingxss 2013-12-11  
andygyf 写道
你好!我现在使用的是struts-mvc,设置login.jsp提交action=“/login.htm”,并且设置login-process-url="/login.htm",单步跟踪后进入CustomerFilterSecurityInterceptor后发现SecurityContextHolder.getContext()返回null,我上网找了两天,仍找不到解决方法,请赐教问题原因及解决方示,不胜感谢!

补充一下,struts-mvc的入口和SpringSecurity3都是过滤器filter,而WEB容器是根据filter的配置顺序来执行的,所以需要将SpringSecurity3的入口filter放在struts-mvc的入口filter的前面。
11 楼 kingxss 2013-12-11  
andygyf 写道
你好!我现在使用的是struts-mvc,设置login.jsp提交action=“/login.htm”,并且设置login-process-url="/login.htm",单步跟踪后进入CustomerFilterSecurityInterceptor后发现SecurityContextHolder.getContext()返回null,我上网找了两天,仍找不到解决方法,请赐教问题原因及解决方示,不胜感谢!

这里应该是跟使用任何的组件作为Control层不存在必然的联系,因为SpringSecurity3根本上是个拦截器,所以问题应该不在你使用了struts-mvc。出现“SecurityContextHolder.getContext()返回null”的问题证明用户没有登录或者用户没有登录成功。由于看不到你的源码和实现,所以我只能在这里建议你进入org.springframework.security.access.intercept.AbstractSecurityInterceptor类中去仔细阅读SpringSecurity3的处理过程。本文附件中的例子是个比较简单的实现,你可以尝试先跑起来,然后比对自身的需求。
10 楼 andygyf 2013-12-08  
你好!我现在使用的是struts-mvc,设置login.jsp提交action=“/login.htm”,并且设置login-process-url="/login.htm",单步跟踪后进入CustomerFilterSecurityInterceptor后发现SecurityContextHolder.getContext()返回null,我上网找了两天,仍找不到解决方法,请赐教问题原因及解决方示,不胜感谢!
9 楼 kingxss 2013-12-06  
andygyf 写道
接上文,如果我想增加login业务代码,在哪里增加,另外就是当logout后,用户信息仍驻留,我想在logout 业务中清除用户信息,在哪里增加。

谢谢

1.login.htm没有对应的映射ACTION,请跳出这个固定思维。login.htm请求被Spring Security3拦截,其业务代码就是Spring Security3中的代码。想添加login的业务代码,需要具体理解Spring Security3的处理流程。这里我建议从CustomizedFilterSecurityInterceptor 的 doFilter()方法处开始看整个登陆流程代码。
2.针对logout,Spring Security3会自动清除用户信息,要是不自动清除用户登陆信息Spring Security3还有存在的必要吗?当然更加丰富的能容请参考官方文档,应该可以做更多登出的后置处理。

希望上面回答对你有帮助。
8 楼 andygyf 2013-12-06  
接上文,如果我想增加login业务代码,在哪里增加,另外就是当logout后,用户信息仍驻留,我想在logout 业务中清除用户信息,在哪里增加。

谢谢
7 楼 andygyf 2013-12-06  
你好,谢谢你的回复,可能我没有表达清楚,login.htm & logout.htm对应的应该是action吧,我没能找到login.htm & logout.htm的映射配置和对应的业务代码。
换句话说当成功能登录后,如何转发http://localhost:8080/ss_rbac/index.htm
我读了所有的程序及配置文件,并搜索login.htm,只有在applicationContext-security.xml & login.jsp文件中找到,就是找不到对应的配置及业务代码。

谢谢
6 楼 kingxss 2013-12-05  
andygyf 写道
你好,请问一下,login.htm & logout.htm在哪里定义的,我运行程序后,如果logout不生效.

谢谢!

login.htm & logout.htm 对应是URL请求而不是页面,具体可以看applicationContext-security.xml 中的配置。可能有些抽象,请仔细体会。
5 楼 kingxss 2013-12-05  
kentkwan 写道
不错鼓励一下

谢谢你的鼓励。Spring Security3的学习曲线不怎么平坦,需要一些看系统代码的经验。祝你好运
4 楼 kingxss 2013-12-05  
zuo_huai 写道
你好,我也有这样的需求,能不能把表的设计也公布一下

你好,具体表结构你可以参考附件中DataSourcePopulator.java类中对数据库中数据初始化方法init()中的内容。从几个表的名字就可以看出数据库的表模型。谢谢!
3 楼 andygyf 2013-12-05  
你好,请问一下,login.htm & logout.htm在哪里定义的,我运行程序后,如果logout不生效.

谢谢!
2 楼 kentkwan 2013-12-04  
不错鼓励一下
1 楼 zuo_huai 2013-12-04  
你好,我也有这样的需求,能不能把表的设计也公布一下

相关推荐

    spring Security3中文教程,经典的

    ### Spring Security3中文教程知识点概览 #### 一、安全核心概念与起步 Spring Security是Spring框架中的一个重要组成部分,主要用于为Web应用提供安全防护。它不仅提供了强大的认证和授权功能,还支持各种加密...

    Spring Security3 Demo

    在"SpringSecurity2Demo"这个项目中,我们可以预期看到以下组成部分: 1. **配置文件**: `spring-security.xml`,这是Spring Security的核心配置文件,包含了过滤器链的配置、用户认证源、授权规则等。 2. **控制...

    Spring Security3中文文档

    Spring Security3中文文档全面而深入地覆盖了Spring Security3的各个方面,从基础知识到高级特性,从理论到实践,都是开发者学习和应用Spring Security3不可或缺的资源。通过阅读和理解这些文档,开发者可以更好地...

    Spring Security学习总结一

    ### Spring Security核心概念与实践详解 #### Spring Security概述 在深入了解Spring Security之前,我们先回顾一下没有Spring Security的权限管理场景。在传统架构中,权限验证逻辑往往与业务逻辑紧密交织,导致...

    精彩:Spring Security 演讲PPT

    ### Spring Security 概述与应用实践 #### 一、引言 在当今互联网时代,网络安全问题日益凸显,尤其是Web应用程序的安全性受到了前所未有的关注。为了应对这些挑战,Spring Security 应运而生,成为了一个非常重要...

    SpringBoot+SpringSecurity+WebSocket

    3. 集成SpringSecurity:配置SpringSecurity的WebSecurityConfigurerAdapter,设置登录认证、权限控制等规则。确保WebSocket连接也需要经过SpringSecurity的认证。 4. 客户端支持:在前端JavaScript中使用WebSocket ...

    Spring Security 学习总结1_3

    "springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...

    spring security3配置和使用实例+教程

    教程文档`教你使用_SpringSecurity_3.0_52页.pdf`会详细指导你如何一步步配置和使用Spring Security。它应该包含了配置文件的示例、如何集成到Spring应用中、如何创建自定义认证逻辑以及如何进行授权设置等内容。...

    springSecurityTest.zip

    总结起来,"springSecurityTest.zip"文件提供了一个完整的环境,让你可以动手实践Spring Security的基础用法。通过学习其中的代码、笔记和文档,你将理解Spring Security如何与Spring框架协同工作,如何设置认证和...

    spring security 3.1学习资料 及 附件下载

    总结,Spring Security 3.1作为一款强大的安全框架,虽然版本较旧,但仍值得开发者深入研究。通过学习和实践,我们可以掌握如何构建安全的Web应用,并理解其背后的原理,为今后的安全开发打下坚实基础。

    Spring Security 完整实例

    **Spring Security 概述** Spring Security 是一个强大的且高度可定制的身份验证和授权框架,...通过理解并实践这些示例,开发者能够更好地理解和掌握Spring Security的精髓,从而在实际项目中构建安全可靠的应用。

    Spring Security实战例子

    **Spring Security 概述** Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,...实践是最好的老师,动手完成这四个小项目将有助于巩固理解,并为你在实际项目中应用Spring Security打下坚实基础。

    spring security 学习总结文档

    【Spring Security 学习总结】 Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于 Java 的应用程序。本学习总结文档主要针对初学者,旨在剖析一个不安全的应用程序并阐述如何通过 ...

    SpringSecurity3.1实际摸索总结

    SpringSecurity 是一个强大的安全框架,主要用于Java应用的安全管理,包括认证和授权。SpringSecurity 3.1 版本在此前的基础上进行了改进和调整,本文将深入探讨其关键知识点。 首先,SpringSecurity 的核心架构...

    我的SpringSecurity实践

    总结起来,《我的SpringSecurity实践》这篇文章可能涵盖了SpringSecurity的源码解析、配置文件的解读,以及在实际项目中如何利用工具进行安全控制。对于想要深入了解SpringSecurity的读者,这是一个很好的学习起点,...

    Spring_Security3_源码分析

    总结,Spring Security 3的源码分析是一个深度学习的过程,涵盖了安全领域的多个方面。通过理解其内部工作机制,开发者可以更好地利用这一强大的框架,为应用程序提供安全的保障。同时,源码分析也能帮助开发者解决...

    Spring Security3 中文版 张卫滨 推荐

    根据给定的信息,我们可以从《Spring Security3 中文版》一书中提炼出多个重要的知识点,主要涉及Spring Security的基础概念、具体实现以及高级配置等方面。下面将详细解释每一部分的关键内容。 ### 第一章:一个不...

    myeclipse 8.5的spring security 2.0.5的简单练习(图解)

    ### MyEclipse 8.5 中 Spring Security 2.0.5 的简易实践 #### 一、背景介绍 本篇文章将详细介绍如何在 MyEclipse 8.5 中使用 Spring Security 2.0.5 来实现一个简单的权限管理示例。Spring Security 是一个功能...

Global site tag (gtag.js) - Google Analytics