SpringSide 3 中的安全框架

合集下载

基于SpringSide的安全框架的应用与扩展

基于SpringSide的安全框架的应用与扩展
全 系 统 。 在 S r gS c r y之 前 , 有 的权 限验 证 逻 辑 p n e u i i t 所
全 机 制 ,但 为 保 证 应 用 的 更 加 安 全 ,pi eui Sr gS crv采 n t 用 过 滤 器拦 截 Srl 请 求 的方 式 达 到 认 证 和 授 权 的 目 e e vt 的 ,这 也 正 是 S r gSc rv安 全 框 架 的 最 大 亮 点 pi eui n t Sr gS crv 基 于 Sr g 声 明 式 安 全 框 架 . 过 pi eui 是 n t pi 的 n 通
基 于 S r g ie的安全框 架的应 用与扩展 pi Sd n
于 增 光 . 刘 竹 松
( 东 工 业 大 学 计算 机学 院 . 州 5 0 0 ) 广 广 10 6
摘 。 : 析 基 于 S r g ie的 安 全 框 架 .主 要 说 明如 何 在 S r g i 要 分 pi Sd n pi Sd n e框 架 下 对 资 源 进 行 认 证 和授 权 , 一 步 通 过 对 S r gS c ry 2 进 p n eu t . i i 0的扩 展 . 实现 直 接 从 数 据 库 读 取权 限 . 强控 制 资 源 的 增 灵 活 性 。 并 结合 一 个 网络 卖验 动 物 资源 库 平 台的 开 发 , 该 框 架 安 全 性 进 行 分 析 。 对
对 于 一 个 完 整 的应 用 系 统 .安 全 系 统 是 一 个 必 不
可 少 的部 分 .任 何 一 个 安 全 系统 都包 括 认 证 和 授 权 两
部 分 ,pig ie的 S r gS c r y也 采 用 了 相 同 的 安 S r Sd n p n eu t i i

Springside技术参考手册

Springside技术参考手册

Springside 3.3.2 技术参考手册1. 总述∙架构风格简述1.概述技术框架选型以工业化大规模软件开发为原则---主流的选型、适宜团队分工的架构,同时照顾轻量级快速开发的需求,Java版的约定大于配置的风格。

)在SpringSide的官方主页上,写着SpringSide 3 中包含的主流组件:Spring 2.5 + Hibernate 3 + Struts 2 + JSP 2.0 + JQuery + JAX-WS 2 (by Apache CXF 2) +SpringSecurity 2.0。

不过,如果你认为和SpringSide 2 相比,升级的只是版本号,那么你就大错特错了。

像我这样从SpringSide 2过来的人,如果能够详细对比SpringSide 2 和SpringSide 3,对于我们理解SpringSide 3肯定更加有帮助。

下面的内容是我自己的一些体会,不正确的地方欢迎大家指正。

从主要的架构来,依然是那么几层,先设计数据库,再写Entity层,再写Dao层,再写Action,然后使用JSP表现出来,其中的Entity和Dao层和Hibernate紧密相关,Action是Struts的主要部分,Spring作为粘合剂,把这些东西连在一起,并提供了一些机制简化编写这些层的工作。

SpringSide就是这样一个大的粘合体,省去了我们自己很多的粘合工作。

从SpringSide 2 到SpringSide 3,这些工作得到进一步的简化,我们开发起来就更爽了。

我认为,我们的开发模式,主要经历了这样的简化过程:第一阶段,代码加一大堆的配置文件第二阶段,代码加少量的配置文件第三阶段,代码加基本上等于零的配置文件这些进步是如何实现的呢?从第一阶段到第二阶段,主要靠的是Annotation,把一些大量的配置工作转移到了Java代码中,那么从第二阶段到第三阶段怎么实现呢?都已经Annotation了,你还有什么办法让配置文件更少?想不到吧!我也想不到,直到我看了SpringSide 3生成的项目,我才知道还有一个好东西叫自动扫描。

三大框架基本原理

三大框架基本原理

三大框架基本原理嗨,小伙伴!今天咱们就来唠唠那传说中的三大框架的基本原理,可有趣啦。

咱们先说说Spring框架吧。

Spring就像是一个超级贴心的大管家呢。

你想啊,在一个复杂的程序世界里,有好多好多的对象,就像一群调皮的小娃娃,到处乱跑,互相之间的关系也是乱七八糟的。

Spring呢,它就出来收拾这个烂摊子啦。

它通过依赖注入这个神奇的魔法,让对象之间的关系变得井井有条。

比如说,有一个对象A需要用到对象B的功能,以前啊,那得在对象A里面到处找对象B,就像在一个大迷宫里找东西一样麻烦。

但是有了Spring,就像有个小精灵把对象B直接送到对象A的手里,这就是依赖注入啦。

而且Spring还能方便地进行组件的管理,就像把那些小娃娃按照不同的功能和特点分成不同的小组,这样整个程序就变得清晰又高效啦。

它还有很多其他的功能,像是AOP(面向切面编程),这个就像是给程序穿上了一层多功能的衣服。

比如说,你想要给一些方法加上日志记录或者权限验证,要是没有AOP,你得在每个方法里面都写一遍相关的代码,那得多麻烦呀。

有了AOP,就像给程序穿上了一件带魔法的衣服,只要在衣服上设置好日志和权限验证的功能,所有相关的方法就都自动有这个功能啦,是不是超级酷呢?再来说说Hibernate框架。

Hibernate就像是一个翻译官,而且是一个超级厉害的翻译官哦。

我们知道,程序和数据库打交道就像两个人讲不同的语言一样,数据库有它自己的一套规则,什么SQL语句之类的。

但是对于程序员来说,写那些复杂的SQL语句有时候真的很头疼。

Hibernate就出现啦,它把对象和数据库表之间建立起了一种奇妙的联系。

在程序里,我们可以像操作普通对象一样操作数据库里的数据。

比如说,我们有一个Java对象,想要把它保存到数据库里,就像把一个小宝贝放到一个专门的宝库里一样。

用Hibernate的话,只要简单地告诉它这个对象要保存,它就会自动把这个对象的属性翻译成数据库能理解的SQL语句,然后把数据妥妥地存进去。

SC3说明书

SC3说明书
感谢您购买士林 SC3 系列变频器,本说明书介绍了如何正确使用本品,在使用前务必认真阅读本说明书。另外,请理解 产品的安全注意事项再使用该产品。
注意安全事项 请合格的专业人员进行安装、操作、维护检查。 在本说明书中,将安全注意事项等级分为“警告”和“注意”。
警告:不正确操作会造成危险情况,将导致死亡或重伤的发生。 注意:不正确操作会造成危险情况,将导致一般或轻微伤害或物体损坏。
注意 各个端子上加的电压只能是操作手册上规定的电压。否则会造成故障或损坏。 请勿对变频器内部的零组件进行耐压测试,因变频器所使用的半导体易受高压击穿而损坏。 通电中或断开电源不久,因为变频器温度较高,仅可触摸操作器。否则会引起烫伤。 请勿错误连接端子。否则会造成故障或损坏。 不要将极性(+、-)搞错。否则会造成故障或损坏。 变频器请安装在无孔的不可燃的壁面上(避免从背后触及变频器散热片)。直接安装在易燃物上或靠近易燃物品,会 导致火灾。 变频器发生故障时,请断开变频器的电源。若持续地流过大电流,会导致火灾。
士林通用变频器 SC3 系列
操作手册
高性价比
SC3-021-0.2K~2.2K SC3-023-0.2K~3.7K SC3-043-0.4K~5.5K
操作手册导读Байду номын сангаас1 交货检查 2
变频器介绍 3 基本操作 4 参数说明 5
检查与维护 6 附录 7
安全注意事项
1. 操作手册导读
1.1 安全注意事项
警告
变频器通电中不可打开其前盖板和接线板。并且不可在前盖板和接线板卸下的状态下运行变频器。否则可能会接触到 高电压的端子和充电部分而造成触电事故。 若要改变接线或检查,首先应关掉变频器的电源。在变频器七段码显示器未熄灭前,表示变频器内部仍有高压,请勿 触摸内部电路及零组件。 本变频器必须正确接地。 请不要用湿手操作、触碰散热器、插拔线缆,否则会导致触电。 请勿在通电时进行冷却风扇的更换,否则会发生危险。通电中进行冷却风扇的交换是危险的

SSHStrutsSpringHibernate三层架构.doc

SSHStrutsSpringHibernate三层架构.doc

目录目录 (1)一、SSH整体介绍 (3)1. 简介 (3)(1)Struts用于表现层,负责页面数据提取,页面动作响应。

(3)(2)Spring是一种轻量级的框架模型,主要负责业务逻辑层的对象创建,表现层的Action的创建,以及持久层的DAO的创建。

(3)(3)Hibernate负责把内存中的数据对象保存到数据库中。

(3)2. 框架集成说明 (3)1) Struts与Spring的集成 (3)2) Spring与Hibernate的集成 (3)3. 程序的包结构 (4)1) 表现层的类包 (4)2) 持久层的类包 (4)3) 业务层的类包 (4)二、核心的配置文件的说明: (5)1. Web.xml文件——工程初始化配置文件 (5)1) Servlet配置 (5)2) init-param设置 (6)3) servlet-mapping配置 (7)4) Spring配置文件配置 (7)5) Spring的Bean工厂配置 (7)6) Filter配置 (8)7) 欢迎页面配置 (9)2. struts-config.xml——Struts的配置文件 (9)(1)Form的配置 (9)(2)Action的配置 (9)(3)全局异常处理类配置 (10)(4)全局转发配置 (10)(5)action配置 (10)(6)资源文件配置 (11)3. applicationContext-common.xml——Spring公共配置文件 (11)(1)Session工厂配置 (11)(2)事务配置 (12)4. applicationContext-beans.xml——Spring中Bean的配置文件 (12)5. hibernate.cfg.xml——Hibernate的配置文件 (13)(1)Hibernate中Session工厂的配置 (13)(2)hbm.xml配置文件 (14)(3)DAO实现类说明 (15)三、Demo实例说明 (15)1、demo.jsp: (15)2、addRate.jsp (16)3、rateList.jsp (16)4、rateinfoAction (17)5、rateinfoAction 的配置(struts-config.xml) (17)6、配置spring文件 (18)7、比例列表(rateList.jsp): (20)一、SSH整体介绍1. 简介本Demo程序采用的是SSH(Struts+Spring+Hibernate)三层架构。

SpringSide3中的Struts2

SpringSide3中的Struts2

在SpringSide 3 中,使用的MVC框架是Struts 2。

Struts 2 向对于Struts 1 来说,具有相当多的优点,有很多人都说,用过Struts 2之后,再也不想看Struts 1了。

然而,任何东西都有它的复杂性,Struts 2也不例外,SpringSide 3做了很多工作来简化Struts 2 的使用。

先来说说Struts 2的特点:1、编写Action变得简单了,Action变成了简单的POJO,再也不用和ActionForm、ActionForward打交道了,返回的时候直接返回字符串即可。

如果要访问Servlet API,则直接使用ServletActionContext类的静态方法。

2、Struts 2提供了插件机制,允许我们自己为它编写插件,当然,要我自己写是不现实的,但是面对别人写的琳琅满目的插件,我一样会昏头。

再网上随便一搜,就可以发现40多种Struts 2插件。

SpringSide 3选择的CodeBehind,就是一种Struts 2插件,它的目的是为了简化配置。

3、Struts 2提供了拦截器机制,之所以编写Action的任务那么简单,靠的都是这些拦截器,比如它们可以自动解析Web表单和URL参数,把它们注入到Action中。

4、Struts 2提供了丰富的taglib,当然,丰富也代表着我们要化更多的时间去学习。

5、Struts 2依然提供了Validator和i18n支持。

等等...下面,我们来看看SpringSide 3是怎么使用Struts 2的吧。

SpringSide 3的主要目标是降低我们使用Struts 2的复杂性,所以,它选择了这些办法:1、没有使用Validator和i18n,对数据的验证交给了JQuery,这变成了表现层的任务,而且JQuery也可以使用AJAX从服务器端进行验证。

至于i18n,江南白衣说小网站用不上。

2、没有使用Struts 2的UI标签,当然也就没有使用FreeMaker或SiteMesh了。

springsecurity3配置

springsecurity3配置

最近项目中要使用到spring-security,闲来没事就研究了下。

发现入门挺简单的,在这里把自己的心得发下,希望对没有接触过想接触的朋友有帮助。

1、在spring-security官网下载最新jar然后拷贝jar到项目的lib下。

2、在classpath下添加security配置文件,例如applicationContext-security.xml.网上现在大多都是2.0的schema. 要根据自己使用的版本而定.下面是3.0的schema.Xml代码1.<?xml version="1.0" encoding="UTF-8"?>2.<beans:beans xmlns="/schema/security"3.xmlns:beans="/schema/beans"4.xmlns:xsi="/2001/XMLSchema-instance"5.xsi:schemaLocation="/schema/beans6./schema/beans/spring-beans-3.0.xsd7./schema/security8./schema/security/spring-security-3.0.xsd">9.10.</beans:beans>3、然后在web.xml中添加配置,内容如下:Xml代码1.<!-- spring security -->2.<context-param>3.<param-name>contextConfigLocation</param-name>4.<param-value>5.classpath*:/applicationContext*.xml6.</param-value>7.</context-param>8.9.<filter>10. <filter-name>springSecurityFilterChain</filter-name>11. <filter-class>12. org.springframework.web.filter.DelegatingFilterProxy13. </filter-class>14. </filter>15. <filter-mapping>16. <filter-name>springSecurityFilterChain</filter-name>17. <url-pattern>/*</url-pattern>18. </filter-mapping>19. <listener>20. <listener-class>21. org.springframework.web.context.ContextLoaderListener22. </listener-class>23. </listener>配置起来很简单,由于我的security是整合到现有项目中的.一些jar可能已经存在. 单独做demo的朋友配置的时候可能会出现问题.本想分开发挣点积分..但怕大家看起来累.. 就发到一起吧.. (*^__^*)使用篇1、建立login.jsp页面.内容如下:Html代码1.<form action="<%=path %>/j_spring_security_check" method="post">ERNAME:<input type="text" name="j_username"value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}" />< br/>3.PASSWORD:<input type="password" name="j_password" value="" /><br/>4.<input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆<br/>5.<input type="submit">6.</form>j_spring_security_check : 为security验证中心(不知道怎么说合适.暂时这么理解吧..). j_username: 验证用户名; j_password: 验证密码; ${sessionScope['SPRING_SECURITY_LAST_USERNAME']}:使用最后一次登录用户名._spring_security_remember_me:记住我...2、xml配置,配置内容如下:Xml代码1.<?xml version="1.0" encoding="UTF-8"?>2.<beans:beans xmlns="/schema/security"3.xmlns:beans="/schema/beans"4.xmlns:xsi="/2001/XMLSchema-instance"5.xsi:schemaLocation="/schema/beans6./schema/beans/spring-beans-3.0.xsd7./schema/security8./schema/security/spring-security-3.0.xsd">9.10. <!-- auto-config = true 则使用from-login. 如果不使用该属性则默认为http-basic(没有session).11. access-denied-page:出错后跳转到的错误页面;12. -->13. <http auto-config="true" access-denied-page="/common/403.jsp">14. <!-- intercept-url:拦截器,可以设定哪些路径需要哪些权限来访问. filters=none 不使用过滤,也可以理解为忽略-->15. <intercept-url pattern="/index.jsp" access="ROLE_USER" />16. <intercept-url pattern="/login.jsp" filters="none" />17. <intercept-url pattern="/common/**" filters="none" />18. <intercept-url pattern="/script/**" filters="none" />19. <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />20. <intercept-url pattern="/user.jsp" access="ROLE_USER" />21.22. <!-- session-management是针对session的管理. 这里可以不配置. 如有需求可以配置. -->23. <!-- id登陆唯一. 后登陆的账号会挤掉第一次登陆的账号error-if-maximum-exceeded="true" 禁止2次登陆; 24. session-fixation-protection="none" 防止伪造sessionid攻击. 用户登录成功后会销毁用户当前的session.25. 创建新的session,并把用户信息复制到新session中.26. -->27. <session-management session-fixation-protection="none">28. <concurrency-control/>29. </session-management>30.31. <!-- login-page:默认指定的登录页面. authentication-failure-url:出错后跳转页面. default-target-url:成功登陆后跳转页面-->32. <form-login login-page="/login.jsp"33. authentication-failure-url="/common/403.jsp"34. default-target-url="/admin.jsp" />35. <!-- logout-success-url:成功注销后跳转到的页面; -->36. <logout logout-success-url="/login.jsp"/>37. <http-basic />38.39. </http>40.41. <!--42. 连接池.我spring配置文件中配的有.所以这里就注掉了.43. <beans:bean id="dataSource" class="mons.dbcp.BasicDataSource">44. <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>45. <beans:property name="url" value="jdbc:mysql://localhost/demo"/>46. <beans:property name="username" value="root"/>47. <beans:property name="password" value="root"/>48. </beans:bean>49. -->50.51. <!-- 权限管理操作-->52. <authentication-manager>53. <authentication-provider>54. <!--55. 密码加密方式. 常用的有md5 和sha.56. salt-source:忘记了.. 手头api关了,网速卡就不上网查了. 类似在md5上又加了一层. 放置暴力破解. 追加安全性.57. <password-encoder hash="md5">58. <salt-source user-property="username"/>59. </password-encoder>60. -->61. <!-- 注入dataSource验证数据库中的用户名.密码.账号状态.和权限相关; -->62. <jdbc-user-service data-source-ref="dataSource"63. users-by-username-query="selectusername,password,enabled from user where username = ?and enabled = 1"64. authorities-by-username-query="select ername, from user u join user_role ur on u.uid = ur.uid join role r on r.rid = ur.rid where ername = ?" />65. <!--66. 使用固定的用户名和密码及权限来做验证.67. <user-service>68. <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />69. <user name="user" password="user" authorities="ROLE_USER" />70. </user-service>71. -->72. </authentication-provider>73. </authentication-manager>74. <!--75. <beans:bean id="userDetailsServiceImpl" class="erDetailsServiceImpl" />76. -->77.78. <!--79. 此配置只是自己学习的一个小demo. 数据库也建的比较随意比较简单. 使用的是角色权限. 个人比较推荐组权限来控制.. (由于工作经验限制,此处为个人理解)80. 我的库如下:81. user:username\password\enabled82. role:name\desc83. user_role:uid\rid84. -->85.</beans:beans>以上配置结束后可以完成用户登录\权限验证等操作.配置和使用到这里就结束了. 今天下午的小心得.. spring-security很强大. 在这里感谢family168的在线帮助. 谢谢.. 希望对没有接触过spring-security的朋友有所帮助.。

springside3个人学习笔记整理(2)

springside3个人学习笔记整理(2)

目标:对生成的实例项目分析Springside3.3.4 View层权限使用了Spring Security 2.0.5和struts2关于Spring Security请参考springside使用——Spring Security 2和struts2的一些资料整理/peachpi/article/details/6283453SpringSide 3 中的安全框架Spring Security 2.0/shangpusp/article/details/5494563非常优秀的权限管理框架-- Spring Security/wenlin56/article/details/6081022struts2的配置使用了convention plugin,实现struts零配置,请参考struts.xmlStruts使用convention-plugin实现零配置/blog/398263convention plugin1. 默认所有的结果页面都存储在WEB-INF/content下,你可以通过设置struts.convention.result.path这个属性的值来改变到其他路径。

如:<constant name="struts.convention.result.path"value="/WEB-INF/page"/>将路径配置到了WEB-INF/page 下。

2. 默认包路径包含action,actions,struts,struts2的所有包都会被struts 作为含有Action类的路径来搜索。

你可以通过设置struts.convention.package.locators属性来修改这个配置。

如:<constant name="struts.convention.package.locators"value="web,action"/>则定义了在项目中,包路径包含web和action的将被视为Action存在的路径来进行搜索。

SpringSecurity3源码分析-BasicAuthenticationFilter

SpringSecurity3源码分析-BasicAuthenticationFilter

SpringSecurity3源码分析-BasicAuthenticationFilter BasicAuthenticationFilter过滤器对应的类路径为org.springframework.security.web.authentication.www.BasicAuthenticationFilterBasic验证⽅式相⽐较⽽⾔⽤的不是太多。

spring security也⽀持basic的⽅式,配置如下Xml代码1. <security:http auto-config="true">2. <!-- <security:form-login login-page="/login.jsp"/>-->3. <security:http-basic/>4. <security:logout logout-success-url="/login.jsp" invalidate-session="true"/>5. <security:intercept-url pattern="/login.jsp*" filters="none"/>6. <security:intercept-url pattern="/admin.jsp*" access="ROLE_ADMIN"/>7. <security:intercept-url pattern="/index.jsp*" access="ROLE_USER,ROLE_ADMIN"/>8. <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>9. </security:http>如果选择basic⽅式,需要把form-login标签的定义给注释掉。

springside3个人学习笔记整理(2)

springside3个人学习笔记整理(2)

目标:对生成的实例项目分析Springside3.3.4 View层权限使用了Spring Security 2.0.5和struts2关于Spring Security请参考springside使用——Spring Security 2和struts2的一些资料整理/peachpi/article/details/6283453SpringSide 3 中的安全框架Spring Security 2.0/shangpusp/article/details/5494563非常优秀的权限管理框架-- Spring Security/wenlin56/article/details/6081022struts2的配置使用了convention plugin,实现struts零配置,请参考struts.xmlStruts使用convention-plugin实现零配置/blog/398263convention plugin1. 默认所有的结果页面都存储在WEB-INF/content下,你可以通过设置struts.convention.result.path这个属性的值来改变到其他路径。

如:<constant name="struts.convention.result.path"value="/WEB-INF/page"/>将路径配置到了WEB-INF/page 下。

2. 默认包路径包含action,actions,struts,struts2的所有包都会被struts 作为含有Action类的路径来搜索。

你可以通过设置struts.convention.package.locators属性来修改这个配置。

如:<constant name="struts.convention.package.locators"value="web,action"/>则定义了在项目中,包路径包含web和action的将被视为Action存在的路径来进行搜索。

springSide3框架的笔记

springSide3框架的笔记

springSide3框架的笔记首先,从官网下载的springSide3并不具备我所需要的jar包,几个列子和我的编写习惯有很大冲突。

仔细观察目录结构发现无法像struts2.0一样,把列子改一下就可以架设成功了。

没办法,下载包用处不是很大,还是看文档把——/display/springside3/Home。

在文档中,首先看到了“快速开发指南”,进去看看。

一键式安装,唉,没兴趣,看看别的。

还是看看“完全技术参考手册”吧,进去后看到。

1. 总述∙架构风格简述∙CRUD程序开发指南∙Spring Framework2. 持久化∙Hibernate、Spring Jdbc∙数据库 - Derby、MySQL、Oracle2. Web∙MVC - Struts2、View - JSP2/Taglib、JQuery3 企业服务∙Web Service - JAX-WS2(CXF)、SoapUI 工具∙JMX∙安全 - Spring Security 2∙应用服务器 - Tomcat,Glassfish,Weblogic4.常见事项∙事务∙日志 - Slf4j+Logback∙缓存 - EhCache∙Utils工具类5 开发过程∙开发实践指南不用说先看看前四项把,只是看看而已。

好了,5分钟到了看完了把。

开始实践把。

开始看第五项“开发实践指南”,重点在这里:1. SpringSide风格项目∙生成SpringSide风格的项目进去后:一、原理SpringSide使用maven的archetype插件进行项目生成,新版的archetype2.0插件比以往有了大幅提升。

SpringSide3.0在archtypes目录里存放使用Velocity语法的项目模板。

新生成的项目中将包含保证能跑起来的项目骨架、配置文件与示例代码。

二、预要求∙设置环境变量JAVA_HOME指向JDK5.0安装目录。

∙下载Maven2.0.9(all in one版已自带),并在环境变量PATH中添加 maven下载目录/bin。

springside3学习

springside3学习

使用SpringSide 3.1.4.3开发Web项目的全过程(上)时间:2009-07-21 00:07 来源:未知作者:京山游侠CSDN IE QQ百度我挖Google POCO Yahoo新浪365Key天极和讯博拉Live奇客鲜果收客饭否叽歪挖客核心提示:SpringSide 3.1.4.3是目前SpringSide的最新版本,也是完成度比较高的一个版本,用来做实际项目的开发应该丝毫不成问题。

这里写一下使用该版本开发一个简单Web项目的全过程,当然,最重要的是我自己的一些心得体会。

我的文章很长,只有耐下性子细看,才能体会SpringSide 3.1.4.3是目前SpringSide的最新版本,也是完成度比较高的一个版本,用来做实际项目的开发应该丝毫不成问题。

这里写一下使用该版本开发一个简单Web项目的全过程,当然,最重要的是我自己的一些心得体会。

我的文章很长,只有耐下性子细看,才能体会个中三味。

第一步、下载SpringSide 3.1.4.3 all-in-one版。

这个过程太简单了,SpringSide的官方网站是,去那里就可以下载了,all-in-one版当然是懒人们的不二选择。

这里有一点很搞笑,该版本标的是SpringSide 3.1.4.3,但是下载后解压缩,解压缩出来的文件是springside-3.1.4.2,这可能是江南白衣的一点小小的失误,据我猜测,3.1.4.3较3.1.4.1的进步应该是加入了jsp-api.jar这一个库,希望白衣这次不要为了更改这个版本号上的失误而再推出一个新版本,如果真要推出新版本,怎么样也应该把我最近研究出来的多数据库的配置加进去。

第二步、安装SpringSide。

如果安装过SpringSide以前的版本,最好把用户目录下的.m2文件夹删掉,这个文件夹是Maven的本地仓库所在地,虽说Maven可以有效保证库文件不会发生版本冲突,但是删除这个文件夹会使安装过程加快,否则,SpringSide的安装过程会不停询问你是否覆盖某某文件。

S3M3框架

S3M3框架

1.框架描述:对于现在的开发框架我们使用开源的spring3, spring3mvc,mybatis3,esayui,需要jdk5以上mybatis3作为数据持久层用来对实体层进行各种操作其中spring3作为容器用来管理类的注入,事务作用在业务逻辑层Spring3mvc+easyui作为表示层,spring3mvc主要用来作为业务逻辑与前端页面的交互,Easyui作为对业务数据的展现。

整体框架图如下所示:2.Spring就我们目前框架使用的部分做下说明:主要是作为生成Bean实例的工厂的容器,把j2ee应用中所有的组件都被当作Bean来管理,包括数据源。

这里主要使用spring的IoC容器,依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

应用程序无需直接在代码中new相关的对象,应用程序由IoC容器进行组装。

Spring有3种注入方式我们这里用到的都是通过set的设置方式注入的,下面在配置文件中对dao和service实现类进行注入为例:<!-- dao 注入--><bean id="userDao" class="org.mybatis.spring.MapperFactoryBean"><property name="sqlSessionFactory" ref="sqlSessionFactory" /><!-- 注入映射器,这里是接口而不是实现类--><property name="mapperInterface" value="erDao"/></bean><!-- Service注入--><bean id="userService" class="erServiceImpl"><property name="userDao" ref="userDao" /></bean>使用<context:annotation-config/>简化配置隐形注册spring中处理元数据的类,这样就能在使用的地方,使用注解自动装配了@Autowiredpublic void setUserService(UserService userService) {erService = userService;}这里userService不再需要new3.springmvc下面对主要的核心类和接口的简介1.DispatcherServlet(前置控制器)作用:拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。

SpringMvc搭建开发框架平台【基本使用说明】

SpringMvc搭建开发框架平台【基本使用说明】

Spring3Mvc开发平台描述:由于公司现有开发框架使用过于复杂,机械性质的工作还需要人工来完成,每个对应的控制器及视图控制器都要进行手动配置XML文件,还需要在全局容器中进行依赖注入,而且对于业务层还需要人工手动进行事物处理等复杂和重复性质的工作,开发效率低下,所以Amundsen研发小组搭建了一套当前最主流的开发平台【Spring3MVC开发框架】。

框架结构及开发规则使用说明如下:一.框架结构主要由以下几部份组成1.Spring + SpringMvc解释:最底层核心框架1.1依赖注入1.2AOP横向切面技术、ASPECT切面框架1.3启用Annotation注解及MVC驱动器2.MyBatis解释:主要应用数据库持久层操作,并且所有相关SQL全部为XML文件方便管理及维护3.SpringSecurity :安全认证框架解释:主要应用于框架的全安性(注:暂时未启用)3.1用户身份的认证过程3.2用户的请求进行拦截并分析是否被授权等过程,3.3会话连接的控制3.4访问端口及地址转换的控制4.视图层:支持任何前台交互视图语言4.1主要交互框架以EXT5.0为主4.2Flex Builder4.6 Actionscript3.0 语言,用于特殊模块处理应用二.框架目录结构说明1./src/com/fcx/app/说明:此目录下为Flex管理部份应用所有核心业务(注:非Flex开发人员禁止更改)2./src/com/longhope/business/说明:此目录下为公司项目所有模块相关的业务文件,每个文件夹都是功能模块的拼音简写(注:文件夹的结构及目录层级是及菜单结构一置的,这样方便对应管理及维护),并且在有效功能模块对应的文件夹下必需要创建“action”、“mapper”、“model”、“service”、”service/impl”等如下文件夹,此结构必需遵循开发框架规则:action :控制器类mapper :Dao接口类及接口所对应的SQLMAP文件(需要注意的是:所有SQL必需大写,除参数)model : 模型类(即:实体对象)service: 业务接口service.impl:业务接口的实现类注意:如果是前后台分离,以远程接口方式开发,那么就是如下的结构,如图所示:前端需要的结构--------------------------------------------------------------------------------------------------后端需要的结构说明:国际化管理(注:此部份为系统预留功能,暂时没应用)4./src/com/fcx/app/androic/src/com/fcx/app/ios说明:移动端开发业务在此目录下开发,因为由于业务的特殊性,web客户端所有请求是需要认证和授权的,而只有移动端是不需要认证授权的,并且所有移动端的请求必需是”.do”结束例如:移动端请求user/login.doWeb端请求user/login.action5./framework说明:此目录下为框架核心配置文件及系统全局参数等文件;例如端口等数据配置/framework/com/fcx/core/说明:此目录下为框架所有通用类备注:此目录下所有配置文件禁止开发人员更改,如果需要变更或追加改修通用类等文件请及(谭亮:管理员)开发人员联系6./lib 开发框架核心业务相关JAR包/lib/common/lib/flex/lib/mybatis/lib/mysql/lib/openCSV/lib/oracle/lib/security/lib/spring/lib/xml说明:所有框架及业务相关JAR包,主要是进行了分类方便管理及维护备注:以上目录结构禁止变更或删除,如果需要追加请联系管理员7./WebRoot/:相关业务文件上传目录/flex:Flash管理平台及前台调用功能模块等页面相关文件(例如:自定义汇总、报表制度定义)/page:所有管理系统交互页面,注此文件夹下的所有子文件夹都是相关模块拼音简写创建,以及层次结构及菜单一置,不允许随意追加或创建(注:所有相关开发并互页面必需在此目下创建,并且及功能模块结构一置)/resources:所有相关资源文件(例如:JS,图片,样式等文件)并且都要有序的创建存储,不允许重复/target:存储全局的入口文件及认证成功或失败等跳转文件,还有捕获系统全局性异常文件/WEB-INF/config/applicationContext-webapp.xml:Spring全局配置文件,不允许开发人员变更jdbc.properties:数据库连接配置文件log4j.properties:日志配置文件(注:此文件已配置完成,自动按日期创建相关日志文件)/web.xml :项目初始化配置文件三.开发框架核心配置文件1.applicationContext-jdbc.xml 数据连接池配置<!-- 加载JDBC资源文件 --><context:property-placeholder location="/WEB-INF/config/jdbc.properties"/><!-- Mysql5.0 数据连接池配置–><bean id="dataSource"class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close"><property name="driverClassName"value="${jdbc.driverClassName}"/><property name="url"value="${jdbc.connectionURL}"/><property name="username"value="${ername}"/><property name="password"value="${jdbc.password}"/><!--<property name="autoCommitOnClose" value="${autoCommitOnClose}"/><property name="checkoutTimeout" value="${checkoutTimeout}"/><property name="initialPoolSize" value="${initialPoolSize}"/><property name="minPoolSize" value="${minPoolSize}"/><property name="maxPoolSize" value="${maxPoolSize}"/><property name="maxIdleTime" value="${maxIdleTime}"/><property name="acquireIncrement" value="${acquireIncrement}"/><property name="maxIdleTimeExcessConnections"value="${maxIdleTimeExcessConnections}"--></bean>2.applicationContext-mybatis.xml 新版MyBatis配置<!-- Spring提供的用于构建MyBatis的客户端sqlSessionFactory对象工厂 --><bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource"ref="dataSource"/><property name="configLocation"value="classpath:mybatis-config.xml"></property><property name="mapperLocations"value="classpath*:com/longhope/business/*/mapper/*.xml" /></bean><!-- 配置sqlSessionTemplate模板类 --><bean id="sqlSessionTemplate"class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory"/></bean><!-- JdbcTemplate --><bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"ref="dataSource"/></bean><!-- JdbcDaoInterface --><bean id="jdbcDao"class="com.fcx.core.jdbc.DaoImple"><property name="dataSource"ref="dataSource"/></bean><!-- 配置事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"ref="dataSource"/></bean><!-- AOP切面技术,实现对Service的声明式事务管理 --><tx:advice id="txAdvice"transaction-manager="transactionManager"> <tx:attributes><tx:method name="set*"propagation="NOT_SUPPORTED"/><tx:method name="get*"propagation="REQUIRED"read-only="true"/><tx:method name="*"propagation="REQUIRED"rollback-for="ng.RuntimeException,ng.Exception"/></tx:attributes></tx:advice>3.applicationContext-springmvc-servlet.xml<!-- 启用基于注解(Annotation-based)的配置 --><context:annotation-config/><!—- 自动描述路径 --><context:component-scan base-package="com.longhope.business.*.action"/><context:component-scan base-package="com.longhope.business.*.service..*"/><!—Aop切面技术 --><aop:config><aop:pointcut id="serviceMethods"expression="execution(* com.fcx.*..service..*Service.*(..)) || execution(*com.longhope.business..service..*Service.*(..)) || execution(*com.longhope.business..*.service..*Service.*(..))"/><aop:advisor advice-ref="txAdvice"pointcut-ref="serviceMethods"/> </aop:config><!—视图解析器 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"p:prefix="/"/>四.开发规则及使用说明(实例说明:以数据编辑模块为例)1.控制器:功能模块对应的业务入口1.1 控制器名称:基本都以功能模块名称拼音简写或有代表性的英文+Action;例如:SjbjAction1.2 控制器说明编写:当前控制器的主要功能及作者,创建日期版本等信息,如下:/*** Copyright(c)Consulting Longhope. All rights are reserved** 数据编辑管理 Action* @author TanLiang* @version Ver 1.0 2015-08-02 初版*/1.3 控制器注解及名字空间定义:如下@Controller//此注解标识为控制器@RequestMapping("Sjbj") //此注解标识为当前控制器的名字空间,而且此名称空间标识必需及菜单ID等数据一置,因为此部份是要及权限相关联的1.4业务接口的注入:如下@Autowired //必需追加此标签,这样业务接口就自动注入private SjbjService sjbjService;备注:而且所有注入的对象不需要在实现GET、SET等方法1.5控制器的方法配置:如下1.5.1 对于视图(JSP/PHP/其它前端)层的请求(备注:对于方法必需追加说明等标识)/*** 功能:数据保存*/@RequestMapping("saveData")//标签为调用的方法public String saveData(S_BS_CORP s_bs_corp,String JsonArray) {s_bs_corp = sjbjService.saveData(s_bs_corp,JsonArray);return /page/sjbj/xxx.jsp; //返回到指定视图层路径}1.5.2 对于视图(Flex或移动端或返回结果为JSON数据)层的请求@RequestMapping("saveData") //标签为调用的方法@ResponseBody //对于返回JSON类型数据必需追加此标签,然后返回相应的对象即可因为所有对象或集合数据都会被框架自动转换为标准的JSON数据结构2.例如请求:Sjbj/saveData.action3.实体类:业务相关实体对象,即:POJO类对象及数据表直接对应如下:@Table("S_BS_CORP")public class S_BS_CORP implements Serializable{@PrimaryKey@Column(mappedName="S_CORP_UUID")private String S_CORP_UUID;@Column(mappedName="S_CORP_CD")private String S_CORP_CD;……}备注:以上实体类中对应的标签,主要应用自动拼组SQL时的业务逻辑而定义4.Dao接口及SqlMap4.1 文件名称规则同上,例如:数据编辑功能模块,需要注意义的是必需创建一对,其中一个是Dao接口,而另一个是接口所对应的SQL方法,而且接口名称及方法名称还有参数及返回值等参数必需对应,如下:--------------------------------------------------------------------------------------------- SjbjMapper.java/ public List queryForList(HashMap map);--------------------------------------------------------------------------------------------- SjbjMapper.xml/<select id="queryForList"parameterType="HashMap"resultType="HashMap"> SELECT * FROM 数据表 WHERE S_CORP_UUID = #{S_CORP_UUID}</select>5.业务接口及业务接口实现类如下:4.1 接口文件必需放在service/目录下SjbjService.java4.2 接口实现类文件必需放在service/impl/目录下SjbjServiceImpl.java备注:业务层接口的名称必需按照此规则创建,否则可能导至无法正常自动创建事物处理,还需要注意的是,在业务接口实现类中必需设置业务标签注解如下:@Service("sjbjService") //此标签必需设置,而名称则还是按模块名称简拼在+Service即可;6.业务生成器:即以上是配置控制器所产生的相关业务文件,那么这种机械性质的工作还是有些麻烦,所以我们开发了一套业务生成器,也就是说我们只要配置好相关业务的数据表名称,及生成目录然后运行即可自动生成了:实体类、Dao接口、Dao接口对应的SQLMAP、业务接口、业务接口实现类等文件,并且在SQLMAP及接口实现类中已经根据数据表的主外键逻辑自动生成基本业务;业务生成了器类路径为:framework/com/fcx/core/generator/BusinessGenerator.java配置好右键直接运行当前业务生成器类就可以了,所有业务相关文件全部生成了,无须手动去创建,此时只需要在控制器中配置业务接口,然后编辑方法传入相应参数就可以正常运行了,如果当前自动生成的基本业务无法满足,那么开发人员可自行编辑或在此基础上进行改修即可;五.备注开发约定如下:说明:目录结构不允许变更,编写代码必需整洁并追加相应标识及说明,否则被视为垃圾代码,并找到编写人员要求重新整理;1.1 数据库表定义规则:所有系统表都定义为:S_数据表SpringMvc搭建开发框架平台【基本使用说明】所有业务表也就是制度表为:C_表号所有汇总表定义为:H_表号模版表定义为:T_表号备注:所有数据表字段名称全部为大写英文字母;1.2项目中的实体类对象定义规则同上例如:S_USER (即:系统用户表)1.3Java开发中的类名定义(主要以模块名称的简写拼音、或有效的英文单词) 如下:控制器:UserAction实体类:S_USER-系统用户表C_H201-固定资产投资H_G101-汇总表Dao映射接口及XML:UserMapper.javaUserMapper.xml业务接口:UserService.java业务接口实现类:UserServiceImpl.java方法名称开头字母小写:saveDetail();所有目录结构及配置文件禁止开发人员更改,如果需要变更或改修及通用类等文件请及(谭亮:管理员)开发人员联系,为了保证项目结构及代码类等文件的整洁性,方便他人维护请遵循开发规则,如有问题请及时联系开发人员:谭亮11/ 1111/ 11。

借助安全框架提升安全运营水平

借助安全框架提升安全运营水平

113责任编辑:赵志远 投稿信箱:netadmin@ 2019.04信息安全Security力现状,设定控制能力优先级、制定规划路标,为安全风险管理的技术规划提供依据。

程序框架可用于指导企业评估安全运营体系的现状,建立一个综合性的安全运营体系,也可以用于评估安全运营体系的成熟度,还可用于简化安全管理者与决策者之间的沟通。

其中最具代表性是NIST CSF 和ISO 27001。

ISO 27001是国际标准,认证后可以被广泛认可。

NIST CSF 框架则有较好的系统性和逻辑性,容易被理解和接受。

从规划落地角度来说,NIST CSF 能与CSC、NIST 800-53、ISO 27001、COBIT、ISA 等控制框架的内容建立对应关系,更容易落地。

风险框架定义了安全风险评估和管理的过程,提供系统化的安全风险管理体系,帮助企业和组织识别和量化安全风险,并且指导安全规划在今年的RSA 大会中,涉及安全风险管理议题数量达空前规模。

其中安全战略相关的议题110个,涉及安全业务管理(C-Suite,面向首席高管的议题)的议题39个,有相当多内容和经验可以学习和借鉴。

在众多议题中,安全框架的议题内容最多,成为本次大会的热点。

绿盟科技安全运营服务产品线总监王延华深入解读了通过安全框架来提升企业的安全运营水平。

美国安全框架分类及用途来自美国信息安全培训机构SANS 的Frank Kim 第一次在大会上系统介绍了美国的网络安全框架。

Frank Kim 将美国现有主流的安全框架分为控制框架(Control Frameworks)、程序框架(Program Frameworks)和风险框架(Risk Framworks)三类(如图1所示)。

控制框架用于描述企业和组织安全风险控制能力;程序框架用于定义安全运营的体系和框架;而风险框架是安全风险管理框架,从更宏观的业务层面和角度描述安全风险如何管理,我们可以将安全风险管理框架看做是为安全运营管理的画像。

SpringSecurity3源码分析-FilterSecurityInterceptor分析

SpringSecurity3源码分析-FilterSecurityInterceptor分析

FilterSecurityInterceptor过滤器对应的类路径为org.springframework.security.web.access.intercept.FilterSecurityInterceptor这个filter是filterchain中比较复杂,也是比较核心的过滤器,主要负责授权的工作在看这个filter源码之前,先来看看spring是如何构造filter这个bean的具体的构造过程的代码片段为//这个方法源自HttpConfigurationBuilder类void createFilterSecurityInterceptor(BeanReference authManager) {//判断是否配置了use-expressions属性boolean useExpressions = FilterInvocationSecurityMetadataSourceParser.isUseExpressions(httpElt);//根据intercept-url标签列表创建授权需要的元数据信息。

后面仔细分析BeanDefinition securityMds = FilterInvocationSecurityMetadataSourceParser.createSecurityMetadataSource(interc eptUrls, httpElt, pc);RootBeanDefinition accessDecisionMgr;//创建voter列表ManagedList<;BeanDefinition>; voters = new ManagedList<;BeanDefinition>;(2);//如果是使用了表达式,使用WebExpressionVoter//没使用表达式,就使用RoleVoter、AuthenticatedVoterif (useExpressions) {voters.add(new RootBeanDefinition(WebExpressionVoter.class));} else {voters.add(new RootBeanDefinition(RoleVoter.class));voters.add(new RootBeanDefinition(AuthenticatedVoter.class));}//定义授权的决策管理类AffirmativeBasedaccessDecisionMgr = new RootBeanDefinition(AffirmativeBased.class);//添加依赖的voter列表accessDecisionMgr.getPropertyValues().addPropertyValue(";decisionVoters";, voters);accessDecisionMgr.setSource(pc.extractSource(httpElt));// Set up the access manager reference for httpString accessManagerId = httpElt.getAttribute(ATT_ACCESS_MGR);//如果未定义access-decision-manager-ref属性,就使用默认的//AffirmativeBasedif (!StringUtils.hasText(accessManagerId)) {accessManagerId = pc.getReaderContext().generateBeanName(accessDecisionMgr);pc.registerBeanComponent(newBeanComponentDefinition(accessDecisionMgr, accessManagerId));}//创建FilterSecurityInterceptor过滤器BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(FilterSecurityInterceptor.class);//添加决策管理器builder.addPropertyReference(";accessDecisionManager";, accessManagerId);//添加认证管理类builder.addPropertyValue(";authenticationManager";, authManager);if (";false";.equals(httpElt.getAttribute(ATT_ONCE_PER_REQUEST))) {builder.addPropertyValue(";observeOncePerRequest";, Boolean.FALSE); }//添加授权需要的安全元数据资源builder.addPropertyValue(";securityMetadataSource";, securityMds);BeanDefinition fsiBean = builder.getBeanDefinition();//向ioc容器注册beanString fsiId = pc.getReaderContext().generateBeanName(fsiBean);pc.registerBeanComponent(new BeanComponentDefinition(fsiBean,fsiId));// Create and register a DefaultWebInvocationPrivilegeEvaluator for use with taglibs etc.BeanDefinition wipe = new RootBeanDefinition(DefaultWebInvocationPrivilegeEvaluator.class);wipe.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference(fsiId));pc.registerBeanComponent(new BeanComponentDefinition(wipe, pc.getReaderContext().generateBeanName(wipe)));this.fsi = new RuntimeBeanReference(fsiId);}现在再仔细分析创建元数据资源的bean过程static BeanDefinition createSecurityMetadataSource(List<;Element>; interceptUrls, Element elt, ParserContext pc) {//创建Url处理类,有两个实现:AntUrlPathMatcher、RegexUrlPathMatcherUrlMatcher matcher = HttpSecurityBeanDefinitionParser.createUrlMatcher(elt);boolean useExpressions = isUseExpressions(elt);//解析intercept-url标签,构造所有需要拦截url的map信息//map中的key:RequestKey的bean定义,value:SecurityConfig的bean定义 ManagedMap<;BeanDefinition, BeanDefinition>; requestToAttributesMap = parseInterceptUrlsForFilterInvocationRequestMap(interceptUrls, useExpressions, pc);BeanDefinitionBuilder fidsBuilder;if (useExpressions) {//定义表达式处理类的beanElement expressionHandlerElt = DomUtils.getChildElementByTagName(elt, Elements.EXPRESSION_HANDLER);String expressionHandlerRef = expressionHandlerElt == null ? null : expressionHandlerElt.getAttribute(";ref";);if (StringUtils.hasText(expressionHandlerRef)) {(";Using bean '"; + expressionHandlerRef + ";' as web SecurityExpressionHandler implementation";);} else {BeanDefinition expressionHandler = BeanDefinitionBuilder.rootBeanDefinition(DefaultWebSecurityExpressionHandler.cla ss).getBeanDefinition();expressionHandlerRef = pc.getReaderContext().generateBeanName(expressionHandler);pc.registerBeanComponent(newBeanComponentDefinition(expressionHandler, expressionHandlerRef));}//定义表达式类型的FilterInvocationSecurityMetadataSourcefidsBuilder = BeanDefinitionBuilder.rootBeanDefinition(ExpressionBasedFilterInvocationSecurity MetadataSource.class);//通过构造函数注入依赖fidsBuilder.addConstructorArgValue(matcher);fidsBuilder.addConstructorArgValue(requestToAttributesMap);fidsBuilder.addConstructorArgReference(expressionHandlerRef);} else {//定义非表达式类型的FilterInvocationSecurityMetadataSourcefidsBuilder =BeanDefinitionBuilder.rootBeanDefinition(DefaultFilterInvocationSecurityMetadata Source.class);//通过构造函数注入依赖fidsBuilder.addConstructorArgValue(matcher);fidsBuilder.addConstructorArgValue(requestToAttributesMap);}fidsBuilder.addPropertyValue(";stripQueryStringFromUrls";, matcher instanceof AntUrlPathMatcher);fidsBuilder.getRawBeanDefinition().setSource(pc.extractSource(elt));return fidsBuilder.getBeanDefinition();}通过以上的bean构造过程,FilterSecurityInterceptor所依赖的决策管理器、认证管理器、安全元数据资源都具备了,该让FilterSecurityInterceptor干活了,其源码为public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {//封装request, response, chain,方便参数传递、增加代码阅读性FilterInvocation fi = new FilterInvocation(request, response, chain);invoke(fi);}public void invoke(FilterInvocation fi) throws IOException, ServletException { if ((fi.getRequest() != null) &;&; (fi.getRequest().getAttribute(FILTER_APPLIED) != null)&;&; observeOncePerRequest) {if (fi.getRequest() != null) {fi.getRequest().setAttribute(FILTER_APPLIED, Boolean.TRUE);}//执行父类beforeInvocation,类似于aop中的beforeInterceptorStatusToken token = super.beforeInvocation(fi);try {//filter传递fi.getChain().doFilter(fi.getRequest(), fi.getResponse());} finally {//执行父类的afterInvocation,类似于aop中的aftersuper.afterInvocation(token, null);}}}继续看父类的beforeInvocation方法,其中省略了一些不重要的代码片段protected InterceptorStatusToken beforeInvocation(Object object) {//根据SecurityMetadataSource获取配置的权限属性Collection<;ConfigAttribute>; attributes = this.obtainSecurityMetadataSource().getAttributes(object);//省略……//判断是否需要对认证实体重新认证,默认为否Authentication authenticated = authenticateIfRequired();// Attempt authorizationtry {//决策管理器开始决定是否授权,如果授权失败,直接抛出AccessDeniedExceptionthis.accessDecisionManager.decide(authenticated, object, attributes); }catch (AccessDeniedException accessDeniedException) {publishEvent(new AuthorizationFailureEvent(object, attributes, authenticated,accessDeniedException));throw accessDeniedException;}}增加说明Collection<;ConfigAttribute>; attributes = this.obtainSecurityMetadataSource().getAttributes(object);这里获取的是权限列表信息,比如说有这个配置<;security:intercept-url pattern=";/index.jsp*"; access=";ROLE_USER,ROLE_ADMIN";/>;如果现在发起一个请求时index.jsp,那么根据这个请求返回的attributes集合就是分别包含ROLE_USER,ROLE_ADMIN属性的两个SecurityConfig对象至于请求url如何匹配的,大家可以通过阅读DefaultFilterInvocationSecurityMetadataSource类的源码,实际上,这里用到了spring 的路径匹配工具类org.springframework.util.AntPathMatcherAntPathMatcher匹配方式的通配符有三种:(匹配任何单字符),*(匹配0或者任意数量的字符),**(匹配0或者更多的目录)由于之前在bean的定义过程已经知道决策管理器是AffirmativeBased,接着看AffirmativeBased的决策过程public void decide(Authentication authentication, Object object, Collection<;ConfigAttribute>; configAttributes)throws AccessDeniedException {int deny = 0;//循环voters,实际上是RoleVoter、AuthenticatedVoterfor (AccessDecisionVoter voter : getDecisionVoters()) {//把具体的决策任务交给voter处理//voter只返回-1、0、1,只有为1才算授权成功int result = voter.vote(authentication, object, configAttributes);if (logger.isDebugEnabled()) {logger.debug(";Voter: "; + voter + ";, returned: "; + result); }switch (result) {case AccessDecisionVoter.ACCESS_GRANTED:return;case AccessDecisionVoter.ACCESS_DENIED:deny++;break;default:break;}}//只要有一个voter拒绝了,则直接抛出访问拒绝异常if (deny >; 0) {throw new AccessDeniedException(messages.getMessage(";AbstractAccessDecisionManager.access Denied";,";Access is denied";));}// To get this far, every AccessDecisionVoter abstainedcheckAllowIfAllAbstainDecisions();}实际上,有三种决策管理器,分别为AffirmativeBased、ConsensusBased、UnanimousBased,各自决策的区别是:AffirmativeBased:只要有一个voter投同意票,就授权成功ConsensusBased:只要投同意票的大于投反对票的,就授权成功UnanimousBased:需要一致通过才授权成功具体决策规则很简单,只是根据voter返回的结果做处理接下来,分别看RoleVoter、AuthenticatedVoter的源码RoleVoter:public int vote(Authentication authentication, Object object, Collection<;ConfigAttribute>; attributes) {int result = ACCESS_ABSTAIN;//从认证实体中获取所有的权限列表Collection<;GrantedAuthority>; authorities = extractAuthorities(authentication);//循环intercept-url配置的access权限列表for (ConfigAttribute attribute : attributes) {if (this.supports(attribute)) {result = ACCESS_DENIED;// Attempt to find a matching granted authority//循环认证实体所拥有的权限列表for (GrantedAuthority authority : authorities) {if(attribute.getAttribute().equals(authority.getAuthority())) {//只要有相同的权限,直接返回成功1return ACCESS_GRANTED;}}}}return result;}AuthenticatedVoter:public int vote(Authentication authentication, Object object, Collection<;ConfigAttribute>; attributes) {int result = ACCESS_ABSTAIN;for (ConfigAttribute attribute : attributes) {if (this.supports(attribute)) {result = ACCESS_DENIED;if (IS_AUTHENTICATED_FULLY.equals(attribute.getAttribute())) {if (isFullyAuthenticated(authentication)) {return ACCESS_GRANTED;}}if (IS_AUTHENTICATED_REMEMBERED.equals(attribute.getAttribute())) {if (authenticationTrustResolver.isRememberMe(authentication) || isFullyAuthenticated(authentication)) {return ACCESS_GRANTED;}}if(IS_AUTHENTICATED_ANONYMOUSLY.equals(attribute.getAttribute())) {if (authenticationTrustResolver.isAnonymous(authentication) || isFullyAuthenticated(authentication)||authenticationTrustResolver.isRememberMe(authentication)) {return ACCESS_GRANTED;}}}}return result;}由于RoleVoter在list列表中的位置处于AuthenticatedVoter前面,只要RoleVoter通过,就不会再执行AuthenticatedVoter了。

SpringSecurity安全访问控制解决方案的安全框架

SpringSecurity安全访问控制解决方案的安全框架

SpringSecurity安全访问控制解决⽅案的安全框架
Spring Security是⼀个能够为基于Spring的企业应⽤系统提供声明式的安全访问控制解决⽅案的安全框架。

它提供了⼀组可以在Spring应⽤上下⽂中配置的Bean,充分利⽤了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注⼊)和AOP(⾯向切⾯编程)功能,为应⽤系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写⼤量重复代码的⼯作。

学习导图
单词汇总
Authorization :授权
Authentication :认证(登录)
WebSecurityConfigurerAdapter : web安全配置类(认证授权配置)
@EnableWebSecurity :开启web安全配置
HttpSecurity : http安全配置
permitAll :放⾏
antMatchers :⽤来匹配某些url路径
UserDetailsService :⽤户详情服务(⽤来加载数据库的⽤户数据) UserDao SecurityContext : Security上下⽂⼯具,保存得有认证成功之后的⽤户信息这是Spring Security导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>。

spring安全框架

spring安全框架

spring安全框架Spring Security是一个功能强大且灵活的框架,它为基于Spring的应用程序提供了全面的安全性解决方案。

它可以用于保护您的应用程序免受各种安全威胁,并且可以轻松地与Spring框架集成。

本文将介绍Spring Security的基本概念、核心功能和使用方法。

首先,让我们来了解一下Spring Security的基本概念。

Spring Security基于Servlet过滤器,它通过一系列的过滤器链来保护应用程序。

这些过滤器可以实现认证(Authentication)和授权(Authorization)等安全功能。

认证是验证用户身份的过程,而授权则是确定用户是否有权限执行某些操作。

Spring Security还提供了一套丰富的API,可以用于自定义认证和授权逻辑。

其次,Spring Security具有许多核心功能,其中包括身份验证、访问控制、密码管理、会话管理等。

身份验证是Spring Security的核心功能之一,它可以通过用户名和密码、LDAP、OAuth等方式来验证用户身份。

访问控制是另一个重要功能,它可以基于角色、权限、IP地址等对用户的访问进行控制。

密码管理功能可以帮助我们安全地存储和管理用户的密码。

会话管理功能可以防止会话固定攻击、会话超时等安全问题。

最后,让我们来看一下如何在Spring应用程序中使用Spring Security。

首先,我们需要在项目中引入Spring Security的依赖。

然后,我们可以通过配置文件或者Java代码来配置Spring Security。

我们可以配置认证管理器、安全过滤器链、用户权限等。

在应用程序中,我们可以通过注解或者XML配置来保护我们的资源,比如URL、方法等。

我们还可以使用Spring Security提供的标签来在页面中进行安全控制。

总之,Spring Security是一个功能强大、灵活且易于使用的安全框架,它可以帮助我们轻松地保护我们的应用程序免受各种安全威胁。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在SpringSide 3的官方文档中,说安全框架使用的是Spring Security 2.0。

乍一看,吓了我一跳,以为Acegi这么快就被淘汰了呢。

上搜索引擎一搜,发现原来Spring Security 2.0就是Acegi 2.0。

悬着的心放下来了。

虽然SpringSide 3中关于Acegi的配置文件看起来很不熟悉,但是读了Acegi 2.0的官方文档后,一切都释然了。

先来谈一谈Acegi的基础知识,Acegi的架构比较复杂,但是我希望我下面的只言片语能够把它说清楚。

大家都知道,如果要对Web 资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。

Acegi对Web资源的保护,就是靠Filter实现的。

如下图:
一般来说,我们的Filter都是配置在web.xml中,但是Acegi不一样,它在web.xml中配置的只是一个代理,而真正起作用的Filter 是作为Bean配置在Spring中的。

web.xml中的代理依次调用这些Bean,就实现了对Web资源的保护,同时这些Filter作为Bean 被Spring管理,所以实现AOP也很简单,真的是一举两得啊。

Acegi中提供的Filter不少,有十多个,一个一个学起来比较复杂。

但是对于我们Web开发者来说,常用的就那么几个,如下图中的被红圈圈标记出来的:
从上到下,它们实现的功能依次是1、制定必须为https连接;2、从Session中提取用户的认证信息;3、退出登录;4、登录;5、
记住用户;6、所有的应用必须配置这个Filter。

一般来说,我们写Web应用只需要熟悉这几个Filter就可以了,如果不需要https连接,连第一个也不用熟悉。

但是有人肯定会想,这些Filter怎么和我的数据库联系起来呢?不用着急,这些Filter并不直接处理用户的认证,也不直接处理用户的授权,而是把它们交给了认证管理器和决策管理器。

如下图:
对于这两种管理器,那也是不需要我们写代码的,Acegi也提供了现成的类。

那么大家又奇怪了:又是现成的,那怎么和我的数据库
关联起来呢?别着急,其实这两个管理器自己也不做事,认证管理器把任务交给了Provider,而决策管理器则把任务交给了Voter,如下图:
现在我要告诉你们,这里的Provider和Voter也是不需要我们写代码的。

不要崩溃,快到目标了。

Acegi提供了多个Provider的实现类,如果我们想用数据库来储存用户的认证数据,那么我们就选择DaoAuthenticationProvider。

对于Voter,我们一般选择RoleVoter就够用了,它会根据我们配置文件中的设置来决定是否允许某一个用户访问制定的Web资源。

而DaoAuthenticationProvider也是不直接操作数据库的,它把任务委托给了UserDetailService,如下图:
而我们要做的,就是实现这个UserDetailService。

图画得不好,大家不要见笑,但是说了这么多总算是引出了我们开发中的关键,那就是我们要实现自己的UserDetailService,它就是连接我们的数据库和Acegi的桥梁。

UserDetailService的要求也很简单,只需要一个返回er对象的loadUserByUsername(String userName)方法。

因此,怎么设计数据库都可以,不管我们是用一个表还是两个表还是三个表,也不管我们是用户-授权,还是用户-角色-授权,还是用户-用户组-角色-授权,这些具体的东西Acegi统统不关心,它只关心返回的那个User对象,至于怎么从数据库中读取数据,那就是我们自己的事了。

反过来再看看上面的过程,我们发现,即使我们要做的只是实现自己的UserDetailService类,但是我们不得不在Spring中配置那一大堆的Bean,包括几个Filter,几个Manager,几个Provider和Voter,而这些配置往往都是重复的无谓的。

好在Acegi 2.0也认识到了这个问题,所以,它设计了一个<http>标签,让Acegi的配置得到了简化。

下面是SpringSide 3中的配置的截图,大家可以看看:
下图是官方文章中的传统Filter设置和<http>元素之间的对应关系:
下面的代码是SpringSide 3中实现UserDetailService的范例,在SpringSide 3的范例中,白衣使用了三个表User、Role、Authority。

但是Acegi不关心你用了几个表,它只关心UserDetails对象。

而决定用户能否访问指定Web资源的,是RoleVoter 类,无需任何修改它可以工作得很好,唯一的缺点是它只认ROLE_前缀,所以搞得白衣的Authority看起来都象角色,不伦不类。

package personal.youxia.service.security;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.dao.DataAccessException;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl;
import erDetails;
import erDetailsService;
import ernameNotFoundException;
import er.Authority;
import er.Role;
import er;
import erManager;
/**
* 实现SpringSecurity的UserDetailsService接口,获取用户Detail信息.
*
* @author calvin
*/
public class UserDetailServiceImpl implements UserDetailsService {
private UserManager userManager;
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException { User user = userManager.getUserByLoginName(userName);
if(user == null)
throw new UsernameNotFoundException(userName + " 不存在" );
List < GrantedAuthority > authsList = new ArrayList < GrantedAuthority > ();
for(Role role : user.getRoles()) {
for(Authority authority : role.getAuths()) {
authsList.add( new GrantedAuthorityImpl(authority.getName()));
}
}
//目前在MultiDatabaseExample的User类中没有enabled, accountNonExpired,credentialsNonExpired, accountNonLocked等属性
//暂时全部设为true,在需要时才添加这些属性.
er userdetail = new er(
user.getLoginName(), user.getPassword(), true, true, true, true, authsList
.toArray( new GrantedAuthority[authsList.size()]));
return userdetail;
}
@Required
public void setUserManager(UserManager userManager) {
this .userManager = userManager;
}
}
最后再来说说这个命名的问题,我对Authentication和Authority这两个单词比较反感,两个原因,一是因为它们太生僻了,二是因为它们长得太像了,明明一个是认证,一个是授权,意思相差很远,外貌却如此相似,确实很烦人。

如果让我来选择,我喜欢Privilege 这个单词,在我刚使用MySQL的时候就跟它很熟了,所以在我的项目中,我可能会用Privilege来代替Authority。

如果我们只使用User-Role两级关系,使用RoleVoter默认的ROLE_前缀当然没有关系,如果是像白衣这样是用三层关系,最好还是把这个前缀改一改,以免混淆。

相关文档
最新文档