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 整合的一些模板: 从上图中可以看 ...
随机推荐
- 制作Kinect体感控制小车教程 <一>
转载请注明出处:http://blog.csdn.net/lxk7280 Kinect体感控制小车 Kine ...
- C# 二分法查找和排序
using System;using System.Collections.Generic;using System.Text; namespace AAA{ public class Dich ...
- [React Unit Testing] React unit testing demo
import React from 'react' const Release = React.createClass({ render() { const { title, artist, outO ...
- nginx源代码分析--ngx_http_optimize_servers()函数
这个函数做了连部分工作:1)以port为入口点 将实用的信息存放到hash表内 2)调用ngx_http_init_listening()函数 对port进行监听 1. 在ngx_http_core_ ...
- php定时任务(自己)
php定时任务(自己) 一.总结 一句话总结:可用php.exe连接php文件和bat文件,bat文件在计划任务中可以设置定时执行, 二. 1.php 2.bat E: "D:\softwa ...
- js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)
js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法) 一.总结 一句话总结:jquery里面多是方法啊,比如jquery对象的宽高.所以取值是方法,赋值就是方法里面带参数. ...
- linux使用.rpm包安装mysql
一:下载mysql的.rpm安装包 点击链接查看下载教程:点击打开链接 二:创建目录,上传文件 创建mysql目录:# mkdir mysql 进入目录:# cd mysql 将下载好的MySQL-s ...
- PatentTips - OpenCL compilation
BACKGROUND The present disclosure relates generally to integrated circuits, such as field programmab ...
- iOS开发系列之三 - UITextField 使用方法小结
// 初始化输入框并设置位置和大小 UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 30 ...
- Qt 无标题无边框程序的拖动和改变大小
最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的标题栏以及最大化.最小化.关闭,菜单按钮,我们就需要 setWindowFlags(Qt::FramelessWi ...