Spring學習實例4-Shiro 登陸

一、修改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

相關文章
相關標籤/搜索