Spring框架:Spring安全
在传统的Web发展,安全码被分散在各个模块,这样方便管理,有时你可能会错过一个地方导致安全漏洞。为了解决这个问题,它的发明Spring Security。它是业务逻辑的有关安全代码的作用全部转移到一个集中管理模块。实质上AOP一个子集。
过滤URL
为了过滤URL,首先要在web.xml中增加一个过滤器。filter-name不能随便填写,由于它和另外一个bean的名称是一样的。
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
以下配置的作用是拦截全部的请求。
<security:http auto-config="true">
<intercept-url pattern="/**" access="ROLE_VIP"/>
</security:http>
auto-config的作用相当于<form-login/><http-basic/><logout/>,它会给你自己主动生成一个登陆页面。access="ROLE_VIP"表示仅仅连接身份为ROLE_VIP的用户,ROLE_VIP这个名称是由我们自定义的。
上面的样例中,Spring框架自己主动生成了一个登陆页面。可是不太美观。
因此,我们须要自定义登陆页面。
<http auto-config="true">
<form-login login-processing-url="/static/j_spring_security_check" login-page="/login" authentication-failure-url="/login? login_error=t"/>
</http>
自己定义的登陆页面代码例如以下。表单中的j_username、j_password、_spring_security_remember_me这几个名字是框架已经定死的。自己不能任意修改。
<spring:url var="authUrl" value="/static/j_spring_security_check"/>
<form method="post" action="${authUrl}">
<input name="j_username" type="text"/>
<input name="j_password" type="password"/>
<input name="_spring_security_remember_me" type="checkbox"/>
<input type="submit"/>
</form>
认证表达式。上面的样例中使用了access="ROLE_VIP"限制了VIP用户的訪问,这还不够,你能够在access中填写复杂的Spring表达式实现更强大的功能。比方以下的样例:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN') and hasIpAddress('192.168.1.2')"/>
</http>
注意一定要开启use-expression=true。
认证表达式中支持的函数有:denyAll、hasAnyRole、hasRole、hasIpAddress、isAnonymouse、isAuthenticated、isFullyAuthenticated、isRememberMe、permitAll。支持的变量有autentication、principal。
HTTPS拦截。有些特殊的URL必需要用HTTPS安全连接。
写法例如以下。
<intercept-url pattern="/admin" requires-channel="https"/>
<intercept-url pattern="/public" requires-channel="http"/>
保护视图
在JSP文件訪问与认证有关的变量。或者依据訪问者的身份显示不同的内容。
訪问认证细节。比方訪问登陆的username。
<sec:authentication property="principal.username"/>
依据不同的身份显示不同的内容。请看以下的样例。
<sec:authorize access="hasRole('ROLE_VIP')">
You are VIP.
</sec:authorize>
认证方式
Spring支持的认证方式有:基于xml配置、基于JDBC、基于LDAP、OpenID、CAS、X509、JAAS。
基于xml配置。将username和password写在配置文件里。
<security:user-service id="userService">
<user name="root" password="123456" authorities="ROLE_VIP,ROLE_ADMIN"/>
<user name="test" password="test" authorities="ROLE_VIP"/>
</security:user-service> <security:authentication-manager>
<authentication-provider user-service-ref="userService"/>
</security:authentication-manager>
基于JDBC。
<security:jdbc-user-service id="userService" data-source-ref="dataSource" users-by-username-query="select username,password,enabled from user where username=?" authorities-by-username-query="select username,authoritiy from user_auth"/>
基于LDAP。
<security:authentication-manager alias="authenticationManager">
<security:ldap-authentication-provider user-search-filter="(uid={0})" group-search-filter="member={0}">
<security:password-compare hash="md5"/> <security:ldap-server url="ldap://example.com/dc=test"/>
</security:ldap-authentication-provider>
</security:authentication-manager>
记住登陆
<http auto-config="true">
<remember-me key="myVipKey" token-validity-seconds="86400"/>
</http>
myVipKey是Cookie中的令牌键名,令牌中保存了过期时间、username、令牌密钥。
拦截方法调用
开启注解方式的安全拦截。
<global-method-security secured-annotations="enabled"/>
依据身份进行拦截。
@Secured("ROLE_VIP")
public void test(){}
过滤返回值。
@PostFilter("filterObject.user.username == principal.name")
public List<User> getUserList(){}
横切授权
<global-method-security>
<protect-pointcut access="ROLE_VIP" expression="execution(@com.example.User * *.*(String))"/>
</global-method-security>
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Spring框架:Spring安全的更多相关文章
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- 跟着刚哥学习Spring框架--Spring容器(二)
Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用. Bean是S ...
- Spring框架 - Spring和Spring框架组成
Spring框架 - Spring和Spring框架组成 Spring是什么?它是怎么诞生的?有哪些主要的组件和核心功能呢? 本文通过这几个问题帮助你构筑Spring和Spring Framework ...
- [Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
- [Spring框架]Spring开发实例: XML+注解.
前言: 本文为自己学习Spring记录所用, 文章内容包括Spring的概述已经简单开发, 主要涉及IOC相关知识, 希望能够对新入门Spring的同学有帮助, 也希望大家一起讨论相关的知识. 一. ...
- [Spring框架]Spring IOC的原理及详解。
这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后 受益匪浅,这里再重温一遍Spring IOC ...
- Spring框架---Spring入门
Spring入门 为了能更好的理解先讲一些有的没的的东西: 什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构 ...
- JavaWeb_(Spring框架)Spring中IoC与DI概念入门
Spring是于2003 年兴起的一个轻量级的Java 开源框架,它由Rod Johnson创建.传统J2EE应用的开发效率低,Spring作为开源的中间件,提供J2EE应用的各层的解决方案,Spri ...
- JavaWeb_(Spring框架)Spring整合Hibernate
Dao层类要继承HibernateDaoSupport.java父类 原先使用Hibernate框架hibernate.cfg.xml配置数据库 <hibernate-configuration ...
- [Spring框架]Spring JDBCTmplate基础入门总结.
前言:前面有讲过 Spring IOC以及AOP的基本使用方法, 这里就再来讲下Spring JDBCTemplate的使用方法. 一, 概述这里先说一下Spring 整合的一些模板: 从上图中可以看 ...
随机推荐
- 使用URLConnection获取网页信息的基本流程 分类: H1_ANDROID 2013-10-12 23:51 3646人阅读 评论(0) 收藏
参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...
- Redis使用文档一
1 Redis概述 1.1前言 Redis是一个开源.支持网络.基于内存亦可持久化的日志型.键值对存储数据库.使用ANSI C编写.并提供多种语言的API. 其开发由VMware主持,是最流行的键值对 ...
- CMakeListx.txt 编辑语法学习
已hello.cpp为源文件,构建一个CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(hello) add_executable( ...
- Android 开发--CMakeList调用本地so文件
这里写代码片Android开发常常遇到Java调用so文件的情况,本文介绍一下Google最近新推出的应用在android studio中的方法–cmakelist.txt格式调用. so文件分为jn ...
- mui监听多个下拉刷新当前处于哪个选项卡
1.滑动触发 <div id="slider" class="mui-slider mui-fullscreen"> <div id=&quo ...
- 十年磨一剑 Delphi再写传奇(不争辩,不解释,十年坚持不懈的努力)
新年伊始,英巴卡迪诺公司(Embarcadero)就在其官网发布了“激动人心的RAD Studio2018年发展规划”公告(见上图).公告中指出,将在于2018年发布10.3.X新版本,新版本兼容Ex ...
- 如何快糙好猛的使用libfacedetection库【最新版】
前言 最近已经很少看CSDN了.这一年多准备考研,基本上怕是不会再怎么上了.以前有一个http://blog.csdn.net/mr_curry/article/details/51804072 如何 ...
- eclipse使用Hibernate tools反向工程插件遇到的几个问题
1,在eclipse使用hibernate工具,生成hibernate配置文件时,可能会提示not parse ....xml错误 参见 加载本地dtd 2,反向工程中,生成配置文件时,一般要填写其默 ...
- C#连接Sqlserver代码
刚开始把数据库的密码搞错了,硬是连不上... //数据库连接类 SqlConnection conn = new SqlConnection("server=.;database=test; ...
- 模块化模式与 OSGi
模块化模式与 OSGi Android 模块化探索与实践 一.前言 万维网发明人 Tim Berners-Lee 谈到设计原理时说过:“简单性和模块化是软件工程的基石:分布式和容错性是互联网的生命.” ...