日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

shiro与springMVC整合

發布時間:2025/3/20 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shiro与springMVC整合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注:該文基于springMVC已經配置好。

1. 架構預覽

項目結構

shiro所需jar包

2. 整合shiro

2.1 配置web.xml

注意,由于shiro的主要作用就是攔截判斷,所以我們不再需要springMVC的LoginInterceptor和PermissionInterceptor攔截器了。其余的springMVC配置的代碼保持不變。
在web.xml里添加shiroFilter:該過濾器名字將與spring.xml里注入的過濾器名字一致。所以當有請求時進了web.xml里時,請求就會被該過濾器轉到spring.xml里的shiro過濾器。

<!-- shiro過慮器,DelegatingFilterProxy通過代理模式將spring容器中的bean和filter關聯起來 --> <filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><!-- 設置true由servlet容器控制filter的生命周期 --><init-param><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param><!-- 設置spring容器filter的bean id,如果不設置則找與filter-name一致的bean--><init-param><param-name>targetBeanName</param-name><param-value>shiroFilter</param-value></init-param> </filter> <filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>

2.2 配置spring.xml

(本人將shiro的配置直接配在該文件下的,一般會新建一個shiro自己的配置文件,就像springMVC的springMVC-servlet.xml文件一樣)

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager"/><property name="loginUrl" value="/login"/><!-- 如果不寫的話,默認去找login.jsp頁面 --><property name="unauthorizedUrl" value="/index.jsp"/> <!-- 認證不通過訪問的頁面 --> <!-- 過慮器鏈定義,從上向下順序執行,一般將/**放在最下邊 --><property name="filterChainDefinitions"><value> /refuse.jsp = anon/login.do = authc <!-- anon過濾器表示沒有權限也可訪問login.do -->/logout.do = logout <!-- 表示訪問logout.do時就直接訪問logout這個過濾器,即直接退出 --> /** = authc <!-- 表示其他的所有路徑都要通過認證后才能訪問 --></value></property></bean><!-- 注入自定義realm --><bean id="myShiroRealm" class="com.mvc.realm.MyShiroRealm"> <property name="accountService" ref="accountService" /> </bean> <!-- 安全管理器 :必須注入--><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myShiroRealm"></property> </bean> <!-- 注入查詢用戶名與密碼的service實現類 --><bean id="accountService" class="com.mvc.service.impl.AccountService"></bean>

securityManager:安全管理器。是必須注入的,所有的過濾都被它管理著。

loginUrl:沒有登錄時就會跳轉到它指定的地址,如果不指定該屬性,則會自動去找項目的根目錄下的”/login.jsp”頁面。

unauthorizedUrl:沒有權限時默認的跳轉路徑。

filterChainDefinitions:過濾鏈。它可對路徑進行過濾。如:
/refuse.jsp = anon anon過濾器表示認證不通過也可訪問,所以這句代碼表示refuse.jsp路徑在沒有登錄時也可訪問
/login.do = authc authc過濾器表示需要認證通過才可訪問,也就是說login.do在沒有登錄時,是不能訪問的,除非設為了loginUrl的值。

2.3 默認攔截器

過濾器簡稱類名解釋示例
1.認證過濾器
anonorg.apache.shiro.web.filter.authc.AnonymousFilter可匿名訪問。無參,一般用于過濾靜態資源/admins/**=anon 表示admins下的所有路徑皆可匿名訪問`
authcorg.apache.shiro.web.filter.authc.FormAuthenticationFilter認證登錄后才可訪問。/admins/user/**=authc
authc屬性usernameParam:表單提交的用戶名參數名( username); passwordParam:表單提交的密碼參數名(password); rememberMeParam:表單提交的密碼參數名(rememberMe);loginUrl:登錄頁面地址(/login.jsp);successUrl:登錄成功后的默認重定向地址;failureKeyAttribute:登錄失敗后錯誤信息存儲key(shiroLoginFailure);
authcBasicorg.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilterhttp身分認證器。無參/admins/user/**=authcBasic
authcBasic屬性applicationName:彈出登錄框顯示的信息(application);
userorg.apache.shiro.web.filter.authc.UserFilter表示必須存在用戶/admins/user/**=user 表示身份認證通過或通過記住我認證通過的可以訪問,此時進行登錄操作不會做檢查
logoutorg.apache.shiro.web.filter.authc.LogoutFilter退出攔截器/logout.do=logout
主要屬性redirectUrl:退出成功后重定向的地址(/)
2.授權過濾器
permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter權限授權過濾器。有參,多參時寫成拼接字符串,各參之間以逗號分隔。多參時需每個權限都通過時才算通過,相當于hasAllRoles()單參:/admins/user/**=perms[add] 表示該路徑只有add權限時才可訪問。多參:/admins/user/**=perms["add,delete"]
portorg.apache.shiro.web.filter.authz.PortFilter端口過濾器/admins/user/**=port[8080] 當端口號不是8080時會將訪問url的端口改為8080后再跳轉。
主要屬性port(80):指定可以通過的端口;
rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter角色授權過濾器,可多參
屬性loginUrl:登錄頁面地址;unauthorizedUrl:未授權后重定向的地址;admins/user/**=roles[“admin,guest”] 多參時,都通過才算通過
restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilter請求方法攔截器(GET=read,POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create),它自動根據請求方法構建權限字符串。/admins/user/**=perms[user:post]會拼接“user:create”權限字符串/users=rest[user],會自動拼出“user:read,user:create,user:update,user:delete”權限字符串進行權限匹配(所有都得匹配,isPermittedAll);
sslorg.apache.shiro.web.filter.authz.SslFilter安全協議攔截器,只有請求協議是https才能通過;否則自動跳轉會https端口(443);其他和port攔截器一樣;/admins/user/**=ssl

2.4 自定義realm

此realm先不從數據庫查詢權限數據

/**** * 自定義Realm * * @author Peter* */ public class MyShiroRealm extends AuthorizingRealm { @Overridepublic String getName() {return"customRealm";}// 支持什么類型的token@Overridepublic boolean supports(AuthenticationToken token) {return token instanceof UsernamePasswordToken;}/*** * 獲取授權信息 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { //先自定義一個query權限,就不從數據庫查詢了 String username = (String) pc.fromRealm(getName()).iterator().next(); if (username != null) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.addStringPermission("query");//權限return info; } return null; } /*** * 獲取認證信息 * * 問題:如何在登錄后不再進登錄頁面了呢???????????????????????????*/ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken at) { UsernamePasswordToken token = (UsernamePasswordToken) at; // 通過表單接收的用戶名 // String username = token.getUsername(); String username = (String) at.getPrincipal();if (username != null && !"".equals(username)) { User user = accountService.getUserByUserName(username); if (user != null && user.getPassword().equals(new String(token.getPassword())) && user.getUsername().equals(token.getUsername())) { return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); }else{//throw new UnknownAccountException(); //如果用戶名錯誤 throw new IncorrectCredentialsException(); //如果密碼錯誤 }} return null; } /**用戶的業務類**/ private IAccountService accountService; public IAccountService getAccountService() { return accountService; } public void setAccountService(IAccountService accountService) { this.accountService = accountService; } }

2.5 登錄

/*** * 提交數據的登錄*/ @RequestMapping(value = "login.do") public String login(String username, String password,ModelMap model) { Subject subject = SecurityUtils.getSubject(); if(subject.isAuthenticated()){return "home.jsp";}else{UsernamePasswordToken token = new UsernamePasswordToken(username, password); String error = null;try { subject.login(token); // subject.logout();} catch (UnknownAccountException e) { error = "用戶名/密 錯誤"; } catch (IncorrectCredentialsException e) { error = "用/密碼 錯誤"; } catch (AuthenticationException e) { //其他錯誤,比如鎖定,如果想單獨處理請單獨catch處理 error = "其他錯誤:" + e.getMessage(); } model.addAttribute("msg", error);System.out.println("用戶認證狀態:"+subject.isAuthenticated());if(subject.isAuthenticated()){return "redirect:home"; }else{return "/login.jsp"; } }}

2.6 退出

由于shiro的sessionManager管理session,所以不用開發退出功能,直接使用shiro的logout攔截器即可退出。 <!-- 請求logout.do執行退出操作 --> /logout.do= logout

2.7 無權限訪問跳轉到refuse.jsp

當用戶無操作權限,shiro將跳轉到refuse.jsp頁面。
使用注解的方式賦的權限,首先看看controller里通過注解限定的權限:

/*** 查詢:注解query權限:只有當realm里查回的權限里有query時才可訪問該方法* * 即訪問該方法時,會先拿query權限去realm里查看授權時查回的權限里是否有query權限* 有的話則允許訪問,否則不允許* @return* @author Peter*/@RequestMapping(value = "query")@RequiresPermissions("query")//指定訪問的權限public String query(){System.out.println("查詢內容");return "/home.jsp";}

當沒有權限訪問時,就會跳轉到refuse.jsp頁面,但是注解方式配置無權限跳轉需要在springMVC的配置文件(springMVC-servlet.xml)里配,可能是因為shiro注解賦權限的配置在這里面吧。代碼如下:

<!-- 使用shiro注解賦權限 --> <bean class=" org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> <!-- 捕獲到沒有權限異常跳轉 到拒絕訪問頁--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><!-- 如果配置了視圖解析,則可不用寫jsp這個后綴 --><prop key="org.apache.shiro.authz.UnauthorizedException">/refuse</prop></props></property> </bean>

總結

以上是生活随笔為你收集整理的shiro与springMVC整合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。