这段时间,工作闲了下来,接触了Spring Security,对于我一个基础很差的人来说,无疑是个挑战啊。

经过一段时间的摸索,终于有了点眉目,在这里,要特别感谢http://blog.csdn.net/u012367513/article/details/38866465 二当家的 博文对我的帮助。我的代码也是在他的基础上整理而来,只是增加了自己的一些见解。 再次感谢他的帮助。

我的基础很是薄弱,最然 二当家的 博文中已经讲解的很是清楚,但是我还是希望自己能过上一遍。

本文适宜读者: Spring 基础薄弱,和我一样,配置文件大白的人。  希望高手们都留下宝贵的意见。

废话不多说,开码!

我希望看完这篇文章后我们能解决一下问题:

首先,Spring Security 到底是用来干嘛的?

再次,Security 是怎么工作的?

最后,我们为什么要用Security。

--------------------------------------------------------------------------

我先大体上说下security的工作流程:

   Spring Security对Web安全性的支持大量地依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。 Spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性。根据自己的需要,可以使用表7.4中所列的几个过滤器来保护自己的应用程序。http://baike.baidu.com/link?url=LhguUpz1g7MnakDzFDFRK9D7n6u6wFffzSbJ7Zkcq3QMDNy741SpXMVGAb4jfz_GAa5J0ORkYvKEGYOD2bIQsa
对于概念,百度百科上的说很明了。
  在我们访问一个资源的之前,会被AuthenticationProcessingFilter(这个过滤器我们会重写)拦截,然后它会调用securityMetadataSource来获取被访问资源所对应的权限集合,然后调用accessDecisionManager 来确认,我们用户是否有权限访问这个资源。
 
---------------------------说了这么多 ,还没见代码。-------------------------------
每个项目的访问入口都是 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>SpringSecurityDemo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!-- 加载Spring security XML 配置文件
为什么要配置这个文件?!!!
因为百度! security是什么? 就是依靠一个特殊的过滤器(DelegatingFilterProxy,他是干嘛的?!),
依靠他来委托一个在spring上下文的一个bean完成工作。
而这个Bean,说白了就是一个过滤器。
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/securityConfig.xml
</param-value>
</context-param> <!-- Spring 容器监听,这尼玛又是个什么东东?
listener. 哦 ,是个监听器啊。
看看他的源码
public void contextInitialized(ServletContextEvent event)
{
contextLoader = createContextLoader();
if(contextLoader == null)
contextLoader = this;
contextLoader.initWebApplicationContext(event.getServletContext());
}
瞅见了么,就特么是来加载上面配置的securityConfig.xml文件
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- 看吧,这就是看个特殊的过滤器,撒手掌柜了,他到底干什么了,为什么我们要配置他?
我们来扒开他的皮,瞅一瞅吧,
//这是他的doFilter方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException
{
Filter delegateToUse = null;
synchronized(delegateMonitor)
{
if(_flddelegate == null) //如果bean为空
{
WebApplicationContext wac = findWebApplicationContext(); //给我拿来配置文件
if(wac == null) //虾米?配置文件为空?! 妈的,给老子抛异常! 你给老子监听的配置吃啦?!
throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?");
_flddelegate = initDelegate(wac); //这是什么?猜都出来了,在配置文件里召唤bean(感情配置文件就是人才市场,掌柜的招小工了..)
}
delegateToUse = _flddelegate; //小工招用完了,就你啦...可怜,三方呢? 工资了? 你他妈的刚毕业吧....
}
invokeDelegate(delegateToUse, request, response, filterChain); //照完小工干嘛去? 干活呗!,给老子干! 干!
}
//这是initDeletegate
protected Filter initDelegate(WebApplicationContext wac)
throws ServletException
{
Filter delegate = (Filter)wac.getBean(getTargetBeanName(), javax/servlet/Filter);
if(isTargetFilterLifecycle())
delegate.init(getFilterConfig());
return delegate;
} //这是invokeDelegate
protected void invokeDelegate(Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException
{
delegate.doFilter(request, response, filterChain);
} 咦? 不对呀,小工要造反了怎么办? 你无良老板就啥都不干?
对,我就是啥都不干? 老子就是这么任性。 老子把你们召唤来,就是给了你们生存的价值
(DelegatingFilterProxy做的事情是代理Filter的方法,从application context里获得bean。
这让bean可以获得spring web application context的生命周期支持,使配置较为轻便。)
你们就知足吧! 唉...初来乍到,谁没有被老板坑过....
-->
<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>
</web-app>
 
转载请注明作者:晌午十一点半(http://www.cnblogs.com/qibotean) 原文地址:http://www.cnblogs.com/qibotean/p/4550539.html

Spring Security 从配置入门 学习讲解。万恶之源------------web.xml的更多相关文章

  1. Spring Security 从配置入门 学习讲解。刽子手------------securityConfig.xml

    不知道我的web.xml 大家都理解了没.  废话确实有点多,可能很多知识点,大家都知道,可是我学的时候,压根什么都不懂啊.... 这篇我们要讲刽子手  securityConfig. 为什么要说他是 ...

  2. Spring Security 入门(1-2)Spring Security - 从 配置例子例子 开始我们的学习历程

    1.Spring Security 的配置文件 我们需要为 Spring Security 专门建立一个 Spring 的配置文件,该文件就专门用来作为 Spring Security 的配置. &l ...

  3. Spring Security极简入门三部曲(上篇)

    目录 Spring Security极简入门三部曲(上篇) 写在前面 为什么要用Spring Security 数据库设计 demo时刻 核心代码讲解 小结 Spring Security极简入门三部 ...

  4. SPRING SECURITY JAVA配置:Web Security

    在前一篇,我已经介绍了Spring Security Java配置,也概括的介绍了一下这个项目方方面面.在这篇文章中,我们来看一看一个简单的基于web security配置的例子.之后我们再来作更多的 ...

  5. Spring Security极简入门三部曲(中篇)

    目录 Spring Security极简入门三部曲(中篇) 验证流程 Authentication接口 过滤器链 AuthenticationProvider接口: demo时刻 代码讲解 小结 Sp ...

  6. Spring Security认证配置(三)

    学习本章之前,可以先了解下上篇Spring Security认证配置(二) 本篇想要达到这样几个目的: 1.登录成功处理 2.登录失败处理 3.调用方自定义登录后处理类型 具体配置代码如下: spri ...

  7. Spring Security认证配置(二)

    学习本章之前,可以先了解下上篇Spring Security基本配置. 本篇想要达到这样几个目的: 1.访问调用者服务时,如果是html请求,则跳转到登录页,否则返回401状态码和错误信息 2.调用方 ...

  8. Spring Security认证配置(一)

    学习本章之前,可以先了解下上篇 Spring Security基本配置. 本篇主要讲述Spring Security基于表单,自定义用户认证配置(上篇中的配置,本篇将不再阐述).一共分为三步: 1.处 ...

  9. spring的Java配置入门(Spring Boot学习笔记之一)

    spring的Java配置 1.创建maven项目 使用idea创建maven项目,这里顺便提一下,idea真的比eclipse好用,早点熟悉吧.然后就是maven是java项目管理最主流的工具,自己 ...

随机推荐

  1. Head First 设计模式-- 总结

    模式汇总:装饰者 :包装一个对象以得到新的行为状态   :封装了基于状态的行为,并使用委托在行为之间切换迭代器 :在对象的结合中游走,而不暴露集合的实现外观   :简化一群类的接口策略   :封装可以 ...

  2. 设置DataSource后DateGridView不显示的问题

    在一个WinForm小程序中,有两处需要用DataGridView控件显示数据.设置DataGridView.DataSource为数据查询结果后,第一个DataGridView可以正常显示数据,而第 ...

  3. examine self thrice a day2017

    1.6.2017 葰γí千萬丆γáò絠ィ壬菏鰯嚸,銣惈絠,倁噵ㄖㄅ者β淂簳掉.千澫丕楆被莂亽抓ィ主鰯點,以佌襲撃.那個記駐,吢軟劊嗐死尓垍己ㄖㄅ.絠仒槇可笑,鯟覀者βる誐手裏魢泾吺有談半リ的籌碼,還茬 ...

  4. linux的帮助信息获取以及man章节的划分

    linux的帮助信息获取以及man章节的划分 linux 帮助 man 章节 linux 获取帮助的途径 (1)help (2)man (3)info command在线获取 (4)程序自带帮助文档 ...

  5. mybatis中crud操作范例

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  6. Yii 读取CVS文件内容插入到数据库

    这个方法和上次写的读取txt文件的方法基本上差不多,直接贴代码,需要的直接拿走 function ImportExcel(){ $file = fopen('test.csv','r'); //输出文 ...

  7. JAVA OO 第二章知识点

    一.JAVA的基础语法 1.关键字 ①关键字:关键字用于定义该门语言,且这些单词对编译器用特殊的含义,而且不能作为标识符. 2.标识符 标识符:在JAVA中我们备选的单词,包括:类名.方法名.字段.变 ...

  8. ShellExecute调用另外一个进程(demo为一个控制led的一段代码)

     public enum ShowCommands : int         {             SW_HIDE = 0,             SW_SHOWNORMAL = 1,    ...

  9. mysql分组合并GROUP_CONCAT

    SELECT  pid,  GROUP_CONCAT(field ORDER BY  coder desc)  'msg'from   product_field    GROUP BY  pid 分 ...

  10. 通过php下载文件并重命名

    $filename = dirname(__FILE__) . '/oldfilename.jpg'; $out_filename = 'newfilename.jpg'; if( ! file_ex ...