shiro安全框架擴展教程--數據對象安全校驗(oval框架)

         很多時候我們都是忽略了對象數據的合法性,以爲簡單通過前臺的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




發佈了57 篇原創文章 · 獲贊 211 · 訪問量 67萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章