shiro的基本使用

1、shiro简介

学一门技术一定要对这门技术提问题,这样你才能学好这门技术,当你将自己提的所有问题都解决了,基本上你就了解了这门技术。只有当你可以解决其他人提出的问题时,才算你掌握了这门技术。

首先,我们先对shiro提几个问题:

shiro是什么?为什么要使用shiro?shiro能帮我们干什么?

Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. 

这是shiro官网的解释,大概意思就是shiro是一个强大的并且容易使用的java安全框架,可执行身份认证、授权、加密和会话管理。

说白了,shiro就是一个登录的认证管理器,你登录之后的身份认证、人员的权限管理、密码加密、密码比对以及对session会话的管理,都可以移交给session管理器进行处理,无需自己处理。

目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。

2、shiro的功能

基本功能点如下图所示:

shiro的基本使用_第1张图片

Authentication:身份认证/登录,验证用户是不是拥有相应的身份;

Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;

Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;

Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;

Web Support:Web支持,可以非常容易的集成到Web环境;

Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;

Concurrency:shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;

Testing:提供测试支持;

Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;

Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

Shiro不会去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口(Realm里面实现)注入给Shiro即可

好了,下面我们开始看下shiro怎么在javaSE中使用,在下篇文章我们再说shiro在javaEE中的使用

shiro在SE环境中登录主要分为几个步骤:

 1、获取安全管理器
 2、获取用户
 3、用户登录验证
 4、角色管理
 5、权限管理
 6、用户退出

首先:我们要在数据库或者配置文件中配置好登录的用户、角色以及角色拥有的权限

在此,我使用了一个init文件配置这些

[users]
root = secret,admin
guest = guest,guest
lonestarr=vespa,goodguy,schwartz
[roles]
admin=drive
schwartz=lightsaber:*
goodgun=winnebago:drive:eagles

users里面配置登录用户以及用户拥有的角色,配置规则为:用户=密码,角色1,角色2...

roles里面配置的是角色以及角色拥有的权限,配置规则为:角色=权限1、权限2...

下面我们开始看代码:

//1、获取安全管理器,
Factory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
org.apache.shiro.mgt.SecurityManager manager=(org.apache.shiro.mgt.SecurityManager) factory.getInstance();
//2、需要设置安全管理器
SecurityUtils.setSecurityManager(manager);
//3、获取subject对象,即将登录的用户
Subject subject=SecurityUtils.getSubject();
Session session=subject.getSession();
session.setAttribute("name", "111");
String name=(String) session.getAttribute("name");
if(subject.isAuthenticated()==false){
UsernamePasswordToken token=new UsernamePasswordToken("root","secret");
token.setRememberMe(true);
try{
subject.login(token);
logger.info("登录成功!");
}catch(UnknownAccountException e){
logger.info("账户不存在");
}catch(IncorrectCredentialsException e){
logger.info("密码不对");
}catch(AuthenticationException e){
logger.info("其他异常");
}


}
//4、角色管理
if(subject.hasRole("admin")){
logger.info("拥有这个角色");
}else{
logger.info("不拥有这个角色");
}
//5、权限管理
if(subject.isPermitted("drive")){
logger.info("拥有这个权限");
}else{
logger.info("不拥有这个权限");
}
//6、退出
subject.logout();
}

shiro是将所有的管理都委托给了SecurityManager,SecurityManager去统一管理用户、角色、权限等信息,相当于shiro的大管家。

好了,这就是基本的shiro在SE中的应用了


你可能感兴趣的:(shiro的基本使用)