`
zhoushu126
  • 浏览: 82322 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

shiro 小结

 
阅读更多
shiro 资料很多,大家可以到网上找,找到后可以改成适合自己方式,就我自己的做个小结,并没有什么新鲜东西,怕忘记而已。

1.shiro 可以直接写JdbcRealm

2.也可以定制自己的,继承AuthorizingRealm就可以了

这里记录下第一种方式并与Spring集成:


第一步:建表
delimiter $$

CREATE TABLE `user` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `mobile_phone` varchar(45) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `ID` (`ID`),
  KEY `ID_2` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8$$


delimiter $$

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ROLE_ID` varchar(45) NOT NULL,
  `ROLE_NAME` varchar(45) NOT NULL,
  `DESCRIPTION` varchar(45) DEFAULT NULL,
  `CREATE_TIME` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8$$

delimiter $$

CREATE TABLE `user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `role_id` varchar(45) NOT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8$$

delimiter $$

CREATE TABLE `permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `permission_id` varchar(45) NOT NULL,
  `permission_name` varchar(45) DEFAULT NULL,
  `permission_note` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8$$

delimiter $$

CREATE TABLE `role_permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` varchar(45) NOT NULL,
  `permission_id` varchar(45) NOT NULL,
  `role_permission_note` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8$$


第二步:集成
<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-core</artifactId>
		<version>1.2.0</version> 
	</dependency> 
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-web</artifactId>
		<version>1.2.0</version> 
	</dependency> 
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-ehcache</artifactId>
		<version>1.2.0</version> 
	</dependency> 
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-spring</artifactId>
		<version>1.2.0</version> 
	</dependency> 
	<dependency>
		<groupId>net.sf.ehcache</groupId>
		<artifactId>ehcache-core</artifactId>
		<version>2.5.3</version> 
	</dependency> 
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-jdk14</artifactId>
		<version>1.6.4</version> 
	</dependency> 


<bean id="sampleRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
		<property name="dataSource" ref="dataSource"></property>
		<property name="authenticationQuery">
			<value>
				select password from user where user_name=?
			</value>
		</property>
		<property name="userRolesQuery">
			<value>
				select a.role_name from role a,user_role b,user c
				where a.role_id=b.role_id and b.user_id=c.id and c.user_name=?
			</value>
		</property>
		<property name="permissionsQuery">
			<value>
				select b.permission_name from role t 
				left join role_permission a on t.role_id=a.role_id 
				left join permission b on a.permission_id=b.permission_id where t.role_name=?
			</value>
		</property>
		<property name="permissionsLookupEnabled" value="true"></property>
		<property name="saltStyle" value="NO_SALT"></property>
		
	</bean>
	<!--  
	<property name="credentialsMatcher" ref="hashedCredentialsMatcher"></property>
	<bean id="hashedCredentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
		<property name="hashAlgorithmName" value="MD5"></property>
		<property name="storedCredentialsHexEncoded" value="false"></property>
		<property name="hashIterations" value="1"></property>
	</bean>
	-->
	<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
	<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
	 
	 <!-- AOP式方法级权限检查  -->
	<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" 
	depends-on="lifecycleBeanPostProcessor">
		<property name="proxyTargetClass" value="true" />
	</bean>
	
	<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager"></property>
	</bean>
	<!-- 
	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="excludedExceptions">
			<props>
				<prop key="org.apache.shiro.authz.UnauthorizedException">
					/unauthorized
				</prop>
				<prop key="org.apache.shiro.authz.UnauthenticatedException">
					/unauthorized
				</prop>
			</props>
		</property>
	</bean>
	-->




这里需要注意下SQL的方式,先是user_name,再是role_name


第三步:验证

public String login()throws Exception {
		UsernamePasswordToken token = new UsernamePasswordToken(this.operId,this.password);
		//记录该令牌,如果不记录则类似购物车功能不能使用。
		token.setRememberMe(false);
		//subject理解成权限对象。类似user
		Subject subject = SecurityUtils.getSubject();
		try {
			subject.login(token);
		} catch (UnknownAccountException ex) {//用户名没有找到
			ex.printStackTrace();
		} catch (IncorrectCredentialsException ex) {//用户名密码不匹配
			ex.printStackTrace();
		}catch (AuthenticationException e) {//其他的登录错误
			e.printStackTrace();
		}
		subject.checkPermission("add");
		subject.checkRole("admin");
		if(subject.isPermitted("add")){
			System.out.println("admin");
		}
		
		if(subject.isPermitted("add")){
			System.out.println("add");
		}
		//验证是否成功登录的方法
		if (subject.isAuthenticated()) {
			return Constants.SUCCESS_KEY;
		}
		return Constants.FAILURE_KEY;
}

分享到:
评论

相关推荐

    SpringBoot与Shiro整合-权限管理实战视频+源码

    #### 五、小结 Spring Boot与Shiro的结合不仅简化了后端应用的开发流程,还提供了强大的安全性和权限管理功能。通过本篇介绍,我们了解了如何在Spring Boot项目中集成Shiro,并实现了基于角色和权限的访问控制。这...

    spring boot集成shiro详细教程(小结)

    Spring Boot 集成 Shiro 详细教程 Spring Boot 集成 Shiro 是一个常见的需求,特别是在项目中需要使用身份验证和授权机制时。下面将详细介绍 Spring Boot 集成 Shiro 的过程,并阐述相关知识点。 知识点一:Shiro ...

    SpringSecurity与shiro的使用

    Spring Security与Shiro的使用 Spring Security和Shiro都...小结 Shiro是一个功能强大且灵活的安全框架,提供了许可、认证、加密和会话管理功能。通过自定义Realm,我们可以实现自己的认证逻辑,满足不同的业务需求。

    JAVA教务管理系统本科毕业设计论文源码.zip

    主要实现了用户的登录注册,公告的浏览,选课操作,不同的管理员对不同信息的管理,教师对课程评分,教师结课等功能。JAVA教务管理系统源码毕业设计,随着中国教育体制的不断改革与完善,学校的学生教师管理员等对...

    程序设计基础与实践二课程设计开题报告.docx

    ### 小结 综上所述,本课程设计的目标是开发一款实用的学生选课管理系统。该系统不仅需要具备高效的数据处理能力和友好的用户界面,还要考虑到安全性和稳定性等方面的问题。通过对系统进行详尽的需求分析和技术选型...

    bbs.rar_BBS java_bbs

    Spring Security或Apache Shiro等框架可以提供这些安全保障。 5. **用户界面和用户体验**:BBS系统的前端部分可能使用HTML、CSS和JavaScript,现代Web开发框架如React或Vue.js可以提升用户体验,实现动态加载和交互...

Global site tag (gtag.js) - Google Analytics