Shiro入门一
Posted Ouka傅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro入门一相关的知识,希望对你有一定的参考价值。
Shiro是由Apache提供的一个强大且易用的Java安全开源框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
在Shrio中主要提供了授权,认证,加密,事务管理(可以不需要web容器 ),web集成,集成等主要功能。
下面就来简单体验一下,我们使用的是Maven项目。
下面是pom文件,shiro依赖了slf4j和log4j包。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fuwh</groupId> <artifactId>shirodemo</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> </dependencies> </project>
需要注意的是,在添加slf4j-log4j12依赖包的时候,在Maven仓库中直接添加的依赖信息中,有scope为test,需要去掉,不然可能会导致下面的错误。
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
由于是第一个例子,我们就按照shiro逛网给出的一种简单方式,用配置文件中写入用户名密码的认证方式来体验一下登陆检证。
[users] fuwh=fuwh1234
package com.fuwh.demo; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ShiroDemo01 { private static Logger log=LoggerFactory.getLogger(ShiroDemo01.class); public static void main(String[] args) { //取得SecurityManager工厂 Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini"); //取得SecurityManager实例 SecurityManager securityManager=factory.getInstance(); //将securityManager绑定到SecurityUtil SecurityUtils.setSecurityManager(securityManager); /* 至此为止,简单的shiro环境就配置好了 */ //取得当前用户 Subject currentUser=SecurityUtils.getSubject(); //取得当前用户的session Session session=currentUser.getSession(); //可以在web容器中一样使用session session.setAttribute("attr","value"); log.info("取得的值:"+session.getAttribute("attr").toString()); //使用shiro来进行登陆验证 if(!currentUser.isAuthenticated()) { UsernamePasswordToken token=new UsernamePasswordToken("fuwh","fuwh1234"); try { currentUser.login(token); log.info("登陆成功!!!"); } catch (Exception e) { e.printStackTrace(); log.error("认证失败..."); } } currentUser.logout(); } }
这就实现了一个简单的通过Shiro的配置文件来验证登陆。
当然,Shiro能做的远远不止这些,下面,我们在shiro.ini文件中加入一些角色的验证信息。
[users] fuwh=fuwh1234,admin [roles] admin=lightsaber:test
修改程序代码如下:
package com.fuwh.demo; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.session.Session; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ShiroDemo01 { private static Logger log=LoggerFactory.getLogger(ShiroDemo01.class); public static void main(String[] args) { //取得SecurityManager工厂 Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini"); //取得SecurityManager实例 SecurityManager securityManager=factory.getInstance(); //将securityManager绑定到SecurityUtil SecurityUtils.setSecurityManager(securityManager); /* 至此为止,简单的shiro环境就配置好了 */ //取得当前用户 Subject currentUser=SecurityUtils.getSubject(); //取得当前用户的session Session session=currentUser.getSession(); //可以在web容器中一样使用session session.setAttribute("attr","value"); log.info("取得的值:"+session.getAttribute("attr").toString()); //使用shiro来进行登陆验证 if(!currentUser.isAuthenticated()) { UsernamePasswordToken token=new UsernamePasswordToken("fuwh","fuwh1234"); try { currentUser.login(token); log.info("登陆成功!!!"); } catch (Exception e) { e.printStackTrace(); log.error("认证失败..."); } } log.info("角色认证开始...."); if(currentUser.hasRole("admin")) { log.info("当前用户有admin角色"); }else { log.info("当前用户没有admin角色"); } log.info("权限认证开始...."); if(currentUser.isPermitted("lightsaber:debug")) { log.info("当前用户有lightsaber:debug权限"); }else { log.info("当前用户没有lightsaber:debug权限"); } currentUser.logout(); } }
2017-08-20 21:16:33,432 [main] INFO [org.apache.shiro.session.mgt.AbstractValidatingSessionManager] - Enabling session validation scheduler... 2017-08-20 21:16:34,048 [main] INFO [com.fuwh.demo.ShiroDemo01] - 取得的值:value 2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 登陆成功!!! 2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 角色认证开始.... 2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 当前用户有admin角色 2017-08-20 21:16:34,051 [main] INFO [com.fuwh.demo.ShiroDemo01] - 权限认证开始.... 2017-08-20 21:16:34,052 [main] INFO [com.fuwh.demo.ShiroDemo01] - 当前用户没有lightsaber:debug权限
上面就是运行的结果了....
以上是关于Shiro入门一的主要内容,如果未能解决你的问题,请参考以下文章
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段