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 整合的一些模板: 从上图中可以看 ...
随机推荐
- Linux下kill进程脚本
Linux下kill进程脚本 在Linux有时会遇到需要kill同一个程序的进程,然而这个程序有多个进程,一一列举很是繁琐,使用按名字检索,统一kill Perl脚本 使用方法 kill_all.pl ...
- javascript的全局变量 分类: C1_HTML/JS/JQUERY 2014-08-07 11:03 562人阅读 评论(0) 收藏
javascipt是一门面向对象的编程语言.由于存在一些全局属性及全局函数,因此可以认为存在一个全局变量,这些全局属性及全局函数均是其属性或函数. 在js核心中,并没有定义一个具体的全局变量,因此,j ...
- jquery获取选中select的文本,值等
jquery获取select选择的文本与值获取select :获取select 选中的 text : $("#ddlregtype").find("option:s ...
- [SCSS] Reuse Styles with the SCSS @mixin Directive
Copy/pasting the same code is redundant and updating copy/pasted code slows development velocity. Mi ...
- 百度富文本编辑器ueditor使用启示
百度富文本编辑器ueditor使用启示 一.总结 一句话总结:使用工具,多去看官方demo,非常详细. 二.百度富文本编辑器ueditor使用启示 官方完整demo 官方完整demo对应的源代码 &l ...
- Activity“ 阻止自动弹出软键盘”的方法 -尤其是对于Tab页下的!
我的activity是Tab页签下的~! 所以应把代码加在继承于TabActivity的那个activity中!!而不是由点击Tab页启动的那个activity <activity androi ...
- [Angular] Organizing Your Exports with Barrels
From: import {LoadUserThreadsEffectService} from "./store/effects/load-user-threads.service&quo ...
- 怎么实现登录之后跳转到登录之前的页面?SpringMVC+Freemarker
项目中,想实现一个功能. 直接访问某个需要登录的url,比如/addArticle,可能会跳转到登录页面login.html. 登录成功之后,自动跳转到/addArticle这个登录前的页面,继续登录 ...
- web项目的WEB-INF目录
WEB-INF是Java的WEB应用的安全目录.所谓安全就是客户端无法访问,只有服务端可以访问的目录. 如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问. ...
- 5.3.3.1 deque其他使用方式
在本节里提供了一些关于deque其他使用方式. 提供相似UNIX中的命令tail的功能,显示一个文件最后面一段文本: def tail(filename, n=10): '返回文件最后的n行文本' w ...