第一次在專案裡使用shiro,網上也搜到很多教程,然而我還是踩了兩個坑。
第乙個是驗證失敗,後來發現是資料庫存的密碼是md5加密的,從網上搜到的教程裡有這樣的一段配置:
id="credentialsmatcher"
class="com.zlms.realm.retrylimithashedcredentialsmatcher">
ref="cachemanager" />
name="hashalgorithmname"
value="md5" />
name="ha****erations"
value="1" />
name="storedcredentialshexencoded"
value="true" />
name="maxcount"
value="3" />
bean>
然後就想當然的以為它會幫我進行加密以後驗證,但是沒有生效,不知為何而。
手動加上這段**:
usernamepasswordtoken token = new usernamepasswordtoken(username, md5util.ge***5(password), remember);
驗證就通過了。
第二個是登入成功跳轉的頁面仍然被攔截,還需要登入,但是我明明已經登入了。從這段**:
subject subject = securityutils.getsubject();
subject.login(token);
system.out
.println("subject " + subject.isauthenticated());
system.out
.println("remember " + subject.isremembered());
system.out
.println("user " + subject.getprincipal());
輸出為:
subject true
remember false
user admin
應該也沒問題。
過濾鏈我是這樣配置的
name="filterchaindefinitions">
/static/** = anon
/unauthorized = anon
/login = anon
/logout = logout
/admin/** =user
value>
property>
當我把user換成anon,跳轉就成功了,但是就達不到攔截管理頁面的目的了。因此問題一定出在身份驗證裡。
我又加了乙個過濾器
id="userfilter"
class="com.zlms.realm.myuserfilter">
bean>
class="org.apache.shiro.spring.web.shirofilte***ctorybean">
name="securitymanager"
ref="securitymanager" />
name="loginurl" value="/login" />
name="unauthorizedurl" value="/loginl" />
name="filters">
"authc" value-ref="formauthenticationfilter" />
"user" value-ref="userfilter" />
property>
name="filterchaindefinitions">
/static/** = anon
/unauthorized = anon
/login = anon
/logout = logout
/admin/** =user
property>
在myuserfilter中:
@override
protected boolean isaccessallowed(servletrequest arg0, servletresponse arg1, object arg2)
輸出如下
allow principal null
allow sub
false
allow principals null
表示這裡subject和登入時的subject不是同乙個,或者內容被清空。
最後在檢查web.xml時發現我的配置是
shirofilterfilter-name>
org.springframework.web.filter.delegatingfilterproxyfilter-class>
param>
targetfilterlifecycleparam-name>
true
param-value>
param>
filter>
shirofilterfilter-name>
/admin/*
嘗試把/admin/*
修改為
/*
再一測試,竟然神奇的解決了那個困擾我三個小時的bug。
最後推測出現這種問題的原因。
由於我想把管理頁面與前台頁面分開,前台不需要做攔截,但是也有登入的功能,所以登入頁面的路徑設定為/login,後台頁面的路徑設定為/admin/*。然後我就想當然的在web.xml裡設定成了
/admin/*
目的是只攔截後台頁面。實際上這樣會導致訪問/login和/admin時subject不一致。
SpringMVC框架整合Shiro驗證框架
第一步 配置web.xml shirofilter org.springframework.web.filter.delegatingfilterproxy targetfilterlifecycle true mydemo login anon mydemo getverifycodeimage ...
springmvc中shiro攔截許可權動態寫入功能
1.一開始,springmvc中shiro攔截配置內容,為靜態寫入方式,對這裡大家都不陌生如 這樣所有許可權新增時都需要在資料庫和配置檔案中進行修改和新增,不利於後期的維護。再後來的專案修改中,我們新增了許可權管理的資料庫表,實現了許可權的動態錄入,那麼同樣這裡的攔截也要和資料庫對應,所以修改了攔截...
springMVC中快速配置shiro
1.在web.xml檔案中配置shiro的過濾器,以攔截專案內的訪問 shirofilter org.springframework.web.filter.delegatingfilterproxy targetfilterlifecycle true shirofilter 2.在spring 的...