让Downpour的<Spring Security 2 配置精讲>简单化,大家一起学习
申明:Spring Security 2 配置精讲,系Downpour原创
?
-------------------------Begin----------------------------
?
?????? "Spring Security 2 配置精讲" 让我认识了Spring Security(以下都简称Security),一直在做毕业设计,最近需要做点安全控制方面的事,所以就来javaeye搜了一下,Downpour写的非常不错,详细明了。我也是在看完了140多页的中文文档后才略微了解,我仔细看了
"Spring Security 2 配置精讲" 的评论,很多初学者和我一样,遇到不少问题。这里主要是提供一个简化
"Spring Security 2 配置精讲" 罢了,同时融合一点Struts2。
????????? 期待Downpour能尽快放出他的大作把Security和Struts2能完全融合起来,特别是拦截器,还有验证。
?
原作者使用了Jetty,这个是做测试非常方便,我相信大多数初学者和我一样没有用过它,都是Tomcat吧,简化版中就没有它。
?
????? 1.为了方便测试,我直接把一些目录放到了WebRoot下面,都是为了快速学习啊,我一直是这么干的。
????? 2.我把数据库security.sql也打包进去了,可以直接导入Mysql,编码是utf8
?
?
????? 我把所遇到过的迷惑拿出来给大家提个醒吧:
?
?????? 1.这里密码都是经过md5加密的,salt值默认是null,具体加密方法有好几种.见:<authentication-provider user-service-ref="securityManager"><password-encoder hash="md5"/></authentication-provider>
?我也写了一个简单的测试类,一看就懂
com.javaeye.sample.support.JUnit.test?
?
???? 2.Struts2的FilterDispather一定要配置在Security的DelegatingFilterProxy后面,在web.xml中。(好像是:拦截器链中当退出FilterDispachter时数据会被压栈处理,Security就获得不到数据,因为数据被OGNL放入ValueStack中了)
?
antlr-2.7.6.jarasm-attrs.jarasm.jaraspectjrt.jaraspectjweaver.jarc3p0-0.9.1.2.jarcglib-2.1.3.jarcglib-nodep-2.1_3.jarclasses12.jarcommon-annotations.jarcommons-beanutils-1.7.0.jarcommons-chain-1.1.jarcommons-codec.jarcommons-collections-2.1.1.jarcommons-dbcp.jarcommons-digester-1.8.jarcommons-fileupload-1.1.1.jarcommons-io-1.1.jarcommons-lang.jarcommons-logging-1.0.4.jarcommons-pool.jarcommons-validator-1.3.1.jarconcurrent-1.3.2.jarconnector.jardom4j-1.6.1.jarehcache-1.2.3.jarfreemarker-2.3.8.jarhibernate-annotations.jarhibernate-commons-annotations.jarhibernate-entitymanager.jarhibernate3.jarjavaee.jarjavassist.jarjstl-1.0.2.jarlog4j-1.2.11.jarmysql-connector-java-5.0.0-beta-bin.jarognl-2.6.11.jarservlet-api.jarspring-security-core-2.0.4.jarspring-security-core-tiger-2.0.4.jarspring-security-taglibs-2.0.4.jarspring.jarstandard.jarstruts2-core-2.0.14.jarstruts2-spring-plugin-2.0.14.jarxwork-2.0.7.jar
?3·我当时在写这个个时候是设置断点调试,观察Security到底是运行的,就设置了一个断点,当然你得加入Security的源代码(推荐大家这样做,我看完中文文档还是迷糊,但是Debug后就豁然开朗了)
?? 我是设置在com.javaeye.sample.security.support.SecurityManagerSupport
?
?
?
4·Debug程序你会发现:(大家Debug直前一定得记得把源文件匹配上,否则你看不到Java代码的,全是Class)
????? loadUserByUsername 只是返回了UserDetails,其实后面许多事都是框架自身帮你完成了,比如:密码加码,校验等。
?
?就拿密码校验来说吧: 你肯定想知道为啥你没做密码校验,它是如何完成的?
??????? Debug后一直setp Over,如果你输入的密码错误,用户名正确,会进入:
org.springframework.security.providers.dao.AbstractUserDetailsAuthenticationProvider
?? 它是个abstract Class,只有一个子类:
org.springframework.security.providers.dao.DaoAuthenticationProvider
? 具体验证用户密码的地方是:
?
?
try { user = retrieveUser(username, (UsernamePasswordAuthenticationToken) authentication); } catch (UsernameNotFoundException notFound) { if (hideUserNotFoundExceptions) { throw new BadCredentialsException(messages.getMessage( "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); } else { throw notFound; } }
?密码错误的话就抛异常,然后由Security的一些异常处理拦截器来处理了,都是框架帮我们做好了。
?
? 如果大家仔细Debug 观察,其实分析拦截器执行顺序,会比较容易学习特别是像Security和Struts2这类使用了Aop的框架。
?
?
-------------------------End----------------------------
?
PS:我做的毕业设计(电子银行)中,以前没有用Security,但是鉴于项目业务涉及到的安全问题肯定是老师问的重点(被雷过),所以不得不做得严谨一些,但是我感觉我之前的设计现在修改起来,工作量还是比较大,因为我直前对管理员做过权限管理,而普通用户没有做,只是用Filter和Interceptor做了一些简单的控制,但是当我读完Security后,我觉得我做得太可笑了。
?
?