shiro安全框架扩展教程--数据对象安全校验(oval框架)

简介:          很多时候我们都是忽略了对象数据的合法性,以为简单通过前台的js验证下是否正确就可以了,这后果比较让人但疼,下面举例个简单的例子,页面需要用户提交个简介,用户这个时候可以写...

         很多时候我们都是忽略了对象数据的合法性,以为简单通过前台的js验证下是否正确就可以了,这后果比较让人但疼,下面举例个简单的例子,页面需要用户提交个简介,用户

这个时候可以写脚本在这个内容里,你说你在js有校验合法性,但是你要明白,现在的抓包工具是可以等你提交的时候,拦截住请求,然后通过编辑器修改了提交的值来绕过前台的js

验证,这样就造成了数据的不合法,所以如果数据安全要求高的,必须在后台再次验证合法性,下面我讲下选择的这个对象校验框架---oval


OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java 语言、JavaScript 、Groovy 、BeanShell 等进行规则的编写。网上资料是很少,所以自己学习的时候碰壁比较多


oval框架可以支持xml,注解配置,我个人倾向于xml配置,因为不想看到一个实体类的字段上写了n多的注解,所以下面我说下如何使用这个框架,灰常简单,暴力,灵活,不需要与页面的表单层打交道


先看看如何单独使用,比较简单


public static void main(String[] args) {
		try {
			XMLConfigurer configurer = new XMLConfigurer(new File("valid-oval.xml"));
			Validator validator = new Validator(configurer);
			List<ConstraintViolation> violations = validator.validate(new Object());
			for (ConstraintViolation violation : violations) {
				System.out.println(violation.getMessage());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

直接通过validate方法传入你需要校验的对象即可,然后看看valid-oval.xml配置文件该如何写


<?xml version="1.0" ?>
<oval
  xmlns="http://oval.sf.net/oval-configuration"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration.xsd">
  
  <constraintSet id="testPattern">
    <notNull />
    <matchPattern message="只允许纯数字组合">
      <pattern pattern="[0-9]+" flags="0" />
    </matchPattern>
  </constraintSet>
  
  <class type="com.silvery.project.cms.model.Authority" overwrite="false" applyFieldConstraintsToSetter="true">

    <field name="name">
      <maxSize max="5" message="最多允许{max}个字符" />
      <assertConstraintSet id="testPattern" />
    </field>
    
    <field name="content">
      <assertConstraintSet id="testPattern" />
    </field>
    
  </class>
  
  
</oval>

有默认的校验实现,有可自定义正则校验,完全可以满足你需要扩展的野心(不得不说有个深坑,我首次下载的是oval-1.84版本,自定义正则死活抛异常,然后换了个1.8的版本马上可以,不知道是不是我的用法有问题,还是bug,有空再仔细研究)



下面再看看如何与spring结合配置


先声明一个validator校验器

<description>OVAL数据校验器配置</description>

	<bean id="validator" class="net.sf.oval.Validator">
		<constructor-arg>
			<list>
				<bean class="net.sf.oval.configuration.xml.XMLConfigurer">
					<constructor-arg type="java.io.InputStream" value="classpath:valid-oval.xml" />
				</bean>
			</list>
		</constructor-arg>
	</bean>


然后类里面直接注入validator即可


@Autowired(required = false)
	protected Validator validator;

if (!validModel) {
			return viewResult.setFormValid(true);
		}
		Validator validator = getValidator();
		if (validator != null) {
			List<ConstraintViolation> violations = getValidator().validate(obj);
			if (!isNull(violations)) {
				viewResult.setFormValid(false);
				viewResult.setFormErrors(validErrorToList(violations));
			} else {
				viewResult.setFormValid(true);
			}
		}
		return viewResult;

下面再看看如何使用注解的方式,虽然这个更方便,但是我觉得还是xml配置比较好管理


private static class TestEntity
{
  @Min(1960)
  private int year = 1977;

  @Range(min=1, max=12)
  private int month = 2;

  @ValidateWithMethod(methodName = "isValidDay", parameterType = int.class)
  private int day = 31;

  private boolean isValidDay(int day)
  {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setLenient(false);
    cal.set(GregorianCalendar.YEAR, year); 
    cal.set(GregorianCalendar.MONTH, month - 1);
    cal.set(GregorianCalendar.DATE, day);
    try {
      cal.getTimeInMillis(); // throws IllegalArgumentException
    } catch (IllegalArgumentException e) { 
      return false;
    }
    return true;
  }
}

这是别人的demo,我就懒得写了, 我写这个资料应该算是比较完整的了,希望对大家有帮助,还有比较多的功能,大家可以看下官方的api




目录
相关文章
|
8月前
|
算法 安全 Java
Shiro【散列算法、过滤器 、Shiro会话、会话管理器、权限表设计】(三)-全面详解(学习总结---从入门到深化)
Shiro【散列算法、过滤器 、Shiro会话、会话管理器、权限表设计】(三)-全面详解(学习总结---从入门到深化)
81 1
|
XML Java API
SpringMVC进阶-校验框架
SpringMVC进阶-校验框架
73 0
|
Web App开发 Java 容器
[Spring] Web层AOP方式进行参数校验
Spring的AOP方式有很多用途,本次记录其使用AOP的方式处理Controller层参数校验问题 思路 使用 Hibernate validator 注解式参数校验 利用AOP织入Controller层方法,在参数校验完成后检查BindingResult里的校验结果 代码 AOP类 package com.
1488 0
|
缓存 安全 网络安全
配置Shiro核心过滤器与相关配置
<!--anon 表示匿名访问,不需要认证以及授权--> <!--authc表示需要认证 没有进行身份认证是不能进行访问的--> <!--roles[admin]表示角色认证,必须是拥有admin角色的用户才行--> <!--user表示用户不一定已通过认证,只要曾被Shiro记住过登录状态的用户就可以正常发起请求,比如rememberMe--> <!--perms表示指定过滤规则,这个一般是扩展使用,不会使用原生的--> <!--port表示请求的URL端口验证--> <!--ssl表示安全的URL请求,协议为https--> <!--rest表示根据请求的方法,
|
XML 敏捷开发 应用服务中间件
WEB核心【Servlet配置和注解重构用户登录】第八章
本篇章主要讲Servlet,两个重点:Servlet路径配置,Servlet注解开发,了解内容Servlet继承数及生命周期,Servlet路径配置,ServletConfig配置
WEB核心【Servlet配置和注解重构用户登录】第八章
|
前端开发
MVC 自定义过滤器/特性来实现登录授权及验证
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。    十年河东十年河西,莫欺少年穷    学无止境,精益求精    最近在做自学MVC,遇到的问题很多,索性一点点总结下。
1894 0

热门文章

最新文章

下一篇
开通oss服务