一、修改web.xml,添加Shiro過濾器html
<!-- Shiro過濾器 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <!-- 該值缺省爲false,表示生命週期由SpringApplicationContext管理,設置爲true則表示由ServletContainer管理 --> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter>
二、修改applicationContext.xml,配置自定義Realm,安全管理器,Shiro過濾器(裏面配置默認登陸頁面和要攔截的URL格式),配置lifecycle的processor,開啓Shiro註解java
<!-- 自定義Realm --> <bean id="myRealm" class="cn.tsingyu.spring.example.realm.MyRealm"/> <!-- 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"/> </bean> <!-- Shiro過濾器 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,這個屬性是必須的 --> <property name="securityManager" ref="securityManager"/> <!-- 身份認證失敗,則跳轉到登陸頁面的配置 --> <property name="loginUrl" value="/index.html"/> <!-- 權限認證失敗,則跳轉到指定頁面 --> <property name="unauthorizedUrl" value="/unauthor.jsp"/> <!-- Shiro鏈接約束配置,即過濾鏈的定義 --> <property name="filterChainDefinitions"> <value> /login=anon /admin*=authc /student=roles[teacher] /teacher=perms["user:create"] </value> </property> </bean> <!-- 保證明現了Shiro內部lifecycle函數的bean執行 --> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- 開啓Shiro註解 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>
三、引入Shiro相關jar包git
四、編寫自定義Realm,覆寫登陸驗證和受權的方法web
package cn.tsingyu.spring.example.realm; import javax.annotation.Resource; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import cn.tsingyu.spring.example.entity.User; import cn.tsingyu.spring.example.service.UserService; public class MyRealm extends AuthorizingRealm{ @Resource private UserService userService; /** * 爲當限前登陸的用戶授予角色和權限 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String userName=(String)principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo(); authorizationInfo.setRoles(userService.getRoles(userName)); authorizationInfo.setStringPermissions(userService.getPermissions(userName)); return authorizationInfo; } /** * 驗證當前登陸的用戶 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String userName=(String)token.getPrincipal(); User user=userService.getByUserName(userName); if(user!=null){ AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),"xx"); return authcInfo; }else{ return null; } } }
五、建立用戶、角色、資源,組織的數據表及用戶角色,角色權限的關係表spring
DROP TABLE IF EXISTS `resource`; CREATE TABLE `resource` ( `id` varchar(32) NOT NULL, `name` varchar(60) DEFAULT NULL, `pid` varchar(40) DEFAULT NULL, `desc` varchar(2000) DEFAULT NULL COMMENT '描述', `url` varchar(3000) DEFAULT NULL, `type` int(11) DEFAULT NULL COMMENT '0.功能按鈕,1.導航菜單', `state` varchar(2) DEFAULT '是' COMMENT '是否有效', `sort` int(11) DEFAULT NULL, `icon` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='資源'; DROP TABLE IF EXISTS `org`; CREATE TABLE `org` ( `id` varchar(32) NOT NULL COMMENT '編號', `name` varchar(60) DEFAULT NULL COMMENT '名稱', `comcode` varchar(40) DEFAULT NULL COMMENT '代碼', `pid` varchar(40) DEFAULT NULL COMMENT '上級部門ID', `sysid` varchar(40) DEFAULT NULL COMMENT '子系統ID', `type` int(11) DEFAULT NULL COMMENT '0,組織機構 1.部門', `leaf` int(11) DEFAULT NULL COMMENT '葉子節點(0:樹枝節點;1:葉子節點)', `sortno` int(11) DEFAULT NULL COMMENT '排序號', `description` varchar(2000) DEFAULT NULL COMMENT '描述', `state` varchar(2) DEFAULT '是' COMMENT '是否有效(否/是)', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='組織'; DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `id` varchar(32) NOT NULL COMMENT '角色ID', `name` varchar(60) DEFAULT NULL COMMENT '角色名稱', `code` varchar(255) DEFAULT NULL COMMENT '權限編碼', `pid` varchar(40) DEFAULT NULL COMMENT '上級角色ID', `remark` varchar(255) DEFAULT NULL COMMENT '備註', `state` varchar(2) DEFAULT '是' COMMENT '是否有效(否/是)', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色'; DROP TABLE IF EXISTS `role_menu`; CREATE TABLE `role_menu` ( `id` varchar(32) NOT NULL COMMENT '編號', `roleId` varchar(40) NOT NULL COMMENT '角色編號', `menuId` varchar(40) NOT NULL COMMENT '菜單編號', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色菜單中間表'; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` varchar(32) NOT NULL COMMENT '編號', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `account` varchar(40) DEFAULT NULL COMMENT '帳號', `password` varchar(40) DEFAULT NULL COMMENT '密碼', `sex` varchar(2) DEFAULT '男' COMMENT '性別', `mobile` varchar(16) DEFAULT NULL COMMENT '手機號碼', `email` varchar(60) DEFAULT NULL COMMENT '郵箱', `weixinId` varchar(200) DEFAULT NULL COMMENT '微信Id', `userType` int(11) NOT NULL, `state` varchar(10) DEFAULT '是' COMMENT '是否有效,是/否', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶'; DROP TABLE IF EXISTS `user_org`; CREATE TABLE `user_org` ( `id` varchar(32) NOT NULL COMMENT '編號', `userId` varchar(40) NOT NULL COMMENT '用戶編號', `orgId` varchar(40) NOT NULL COMMENT '組織編號', `manager` varchar(2) DEFAULT '否' COMMENT '是否主管,是/否', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶組織中間表'; DROP TABLE IF EXISTS `user_role`; CREATE TABLE `user_role` ( `id` varchar(32) NOT NULL COMMENT '編號', `userId` varchar(40) NOT NULL COMMENT '用戶編號', `roleId` varchar(40) NOT NULL COMMENT '角色編號', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶角色中間表'; CREATE TABLE `menu` ( `id` varchar(32) NOT NULL, `name` varchar(255) DEFAULT NULL, `url` varchar(255) DEFAULT NULL, `pid` varchar(32) DEFAULT NULL, `seq` int(2) DEFAULT NULL, `icon` varchar(60) DEFAULT NULL, `type` varchar(10) DEFAULT NULL, `state` int(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
完整代碼:sql
http://git.oschina.net/smilease/spring-example/tree/v0.2.2apache
參考:安全
http://www.iteye.com/blogs/subjects/shiro shiro教程微信
http://git.oschina.net/chunanyong/springrain springrainapp