乐虎游戏|乐虎国际登录|欢迎你

Shiro权限认证

日期:2019-11-03编辑作者:计算机资讯

Shiro权限认证

  Apache Shiro是三个强有力而灵活的开源安全框架(本来想传到网盘供我们下载,不过出于本国网盘动不动将在关闭清楚顾客数量;所以作者提供了另二个shiro的国语文书档案下载链接:

官网:

意气风发、权限认证中央因素

权力认证顾名思义,正是在动用体系中,调控什么人能访问哪些能源。大旨因素有仨:权限、剧中人物、客商

图片 1

权限:即操作能源的义务,如访谈有个别url,对有些模块数据开展增加和删除改查

剧中人物:权限的集纳,生机勃勃种剧中人物能够包含各个权力。举个例子操作员剧中人物可查阅系统账单、实行买单操作二种权力。

客商:也正是身份ID明中提到的subject生机勃勃角。

二、授权

shiro授权的艺术平时常有二种:

1、编制程序式授权:在代码中开展授权操作,可依照角色和权杖三种方式。

2、评释式授权:使用注脚对章程或类举办授权,注脚该类可被哪些权力、剧中人物所接受。

3、Jsp标签授权:shiro相比较灵活的地点小编感觉正是jsp标签授权,通过shiro的guest、user、principal等标签,可透过会见权限的例外,调节页面音信体现。免去了一大片段后台管理逻辑。好方便,好好用。后边会有详实介绍。

三、编制程序式授权实例

1、相仿首先创造ini文件

[users]
java1234=123456,role1,role2
jack=123,role1

那是一个透过角色授权的措施,具体意思是指:客户名叫java1234的顾客具备role1,role2剧中人物的义务,jack客户具备role1的权利。

2、java代码通过hasRole 和checkRole的点子可看清某顾客是还是不是具备role1、role2脚色义务。

那边首先将某个shiro最早化、预管理的操作封装成一个util类

public class ShiroUtil {
 public static Subject login(String configFile,String userName,String password){
  // 读取配置文件,初始化SecurityManager工厂
  Factory factory=new IniSecurityManagerFactory(configFile);
  // 获取securityManager实例
  SecurityManager securityManager=factory.getInstance();
  // 把securityManager实例绑定到SecurityUtils
  SecurityUtils.setSecurityManager(securityManager);
  // 得到当前执行的用户
  Subject currentUser=SecurityUtils.getSubject();
  // 创建token令牌,用户名/密码
  UsernamePasswordToken token=new UsernamePasswordToken(userName, password);
  try{
   // 身份认证
   currentUser.login(token); 
   System.out.println("身份认证成功!");
  }catch(AuthenticationException e){
   e.printStackTrace();
   System.out.println("身份认证失败!");
  }
  return currentUser;
 }
}

新建roleTest类,通过调用user的hasRole、checkRole方法决断顾客权限。

public class RoleTest {

 @Test
 public void testHasRole() {
  Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "java1234", "123456");
  // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
  System.out.println(currentUser.hasRole("role1")?"有role1这个角色":"没有role1这个角色");
  boolean []results=currentUser.hasRoles(Arrays.asList("role1","role2","role3"));
  System.out.println(results[0]?"有role1这个角色":"没有role1这个角色");
  System.out.println(results[1]?"有role2这个角色":"没有role2这个角色");
  System.out.println(results[2]?"有role3这个角色":"没有role3这个角色");
  System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2"))?"role1,role2这两个角色都有":"role1,role2这个两个角色不全有");

  currentUser.logout();
 }

 @Test
 public void testCheckRole() {
  Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "java1234", "123456");
  // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
  currentUser.checkRole("role1");
  currentUser.checkRoles(Arrays.asList("role1","role2"));
  currentUser.checkRoles("role1","role2","role3");

  currentUser.logout();
 }
}

通过权限permission的权能验证情势如下:

[users]
java1234=123456,role1,role2
jack=123,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete

此间就补充了role1、role2客户切实具备哪些操作权,role1可开展select操作,同理,role2可进展增加和删除改操作。相仿调用user关于permission认证的法子,可对客户具体操作权限实行求证。

public class PermissionTest {

 @Test
 public void testIsPermitted() {
  Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
  // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
  System.out.println(currentUser.isPermitted("user:select")?"有user:select这个权限":"没有user:select这个权限");
  System.out.println(currentUser.isPermitted("user:update")?"有user:update这个权限":"没有user:update这个权限");
  boolean results[]=currentUser.isPermitted("user:select","user:update","user:delete");
  System.out.println(results[0]?"有user:select这个权限":"没有user:select这个权限");
  System.out.println(results[1]?"有user:update这个权限":"没有user:update这个权限");
  System.out.println(results[2]?"有user:delete这个权限":"没有user:delete这个权限");
  System.out.println(currentUser.isPermittedAll("user:select","user:update")?"有user:select,update这两个权限":"user:select,update这两个权限不全有");

  currentUser.logout();
 }

 @Test
 public void testCheckPermitted() {
  Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
  // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
  currentUser.checkPermission("user:select");
  currentUser.checkPermissions("user:select","user:update","user:delete");
  currentUser.logout();
 }
}

      平安实体:固然被权力系统保障的靶子,举例薪金数额。  

图片 2

四、shiro与web集成实行权力认证

下边介绍在java web程序中应用Shiro举行权力认证。

  1. 率先也是增添shiro相关jar包:shiro-web、shiro-core;commons-logging、slf4j-api、log4j;jstl、javax.servlet.jsp-api、javax.servlet-api

  2. 在web.XML中增加shiroFilter过滤器,并伊始化创制的shiro.ini配置文件。

         org.apache.shiro.web.env.EnvironmentLoaderListener




         ShiroFilter
         org.apache.shiro.web.servlet.ShiroFilter



         ShiroFilter
         /*



shiro.ini文件

    [main]
    authc.loginUrl=/login
    roles.unauthorizedUrl=/unauthorized.jsp
    perms.unauthorizedUrl=/unauthorized.jsp
    [users]
    java1234=123456,admin
    jack=123,teacher
    marry=234
    json=345
    [roles]
    admin=user:*
    teacher=student:*
    [urls]
    /login=anon
    /admin=authc
    /student=roles[teacher]
    /teacher=perms["user:create"]

3.创建login和adminservlet,分别用于直接登陆转发到login.jsp,和admin登录进行身份验证,转发到succeess.jsp和error.jsp

    public class LoginServlet extends HttpServlet{
     private static final long serialVersionUID = 1L;
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("login doget");
      req.getRequestDispatcher("login.jsp").forward(req, resp);
     }
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("login dopost");
      String userName=req.getParameter("userName");
      String password=req.getParameter("password");
      Subject subject=SecurityUtils.getSubject();
      UsernamePasswordToken token=new UsernamePasswordToken(userName, password);
      try{
       subject.login(token); 
       resp.sendRedirect("success.jsp");
      }catch(Exception e){
       e.printStackTrace();
       req.setAttribute("errorInfo", "用户名或者密码错误");
       req.getRequestDispatcher("login.jsp").forward(req, resp);
      }
     }
    }

4.配置数据源-这里介绍两种reaml:Text Reaml和自定义JDBC reaml 。

**Text Reaml 配置详情与访问流程**

text
Reaml配置整合到Shiro.ini文件中,具体配置了四个用户,java1234拥有admin角色权限,jack拥有teacher角色权限;角色admin可对user进行任意crud操作,teacher可对student进行crud操作;访问的urls,请求/login地址时,这里的anon是指游客身份,不需要进行任何身份认证;请求/admin地址时,需要进行身份认证,进行filter过滤后,跳转到【main】中进行了配置为/login
(jsp页面),同样,role和perms的权限认证页设置为unauthorized.jsp;

上面ini配置达到的效果就是:当请求访问localhost:8080/shiro/login
时直接跳到hello页面,无需进行身份验证。当访问localhost:8080/shiro/admin时,先转发到login.jps进行身份验证,进入adminServlet,验证结束后转发到error或succeess页面。再次访问admin地址时,由于第一次访问记录了用户登录信息,故无需在登陆直接跳转到success页面。而访问localhost:8080/shiro/student时,login信息如果使用json(没有任何角色权限的用户),则因为该用户权限不足(因为配置中访问student需要teacher角色)直接跳转到无权限访问页面。这就是使用
textReaml进行身份验证和权限验证的配置。

**自定义 JDBC Reaml的配置与访问流程**

由于text
Reaml的信息毕竟有限,配置也相对比较麻烦,所以一般应用程序使用的都是自定义reaml,此处创建一个自定义JDBC
readml并演示reaml与java程序结合的流程。

![](http://www.bkjia.com/uploads/allimg/160423/04300Q0A-1.png)

由于需要创建数据库(创建用户、角色、权限三张表,依次主外键关联),然后首先引入数据库驱动jar包;在shiro,ini文件中指定当前securityManager使用的验证策略是自定义jdbcReaml。

    [main]
    authc.loginUrl=/login
    roles.unauthorizedUrl=/unauthorized.jsp
    perms.unauthorizedUrl=/unauthorized.jsp
    myRealm=com.java.realm.MyRealm
    securityManager.realms=$myRealm
    [urls]
    /login=anon
    /admin*=authc
    /student=roles[teacher]
    /teacher=perms["user:create"]

最后创建数据库连接Util类和myReaml类调用底层数据查询dao即可。

    /**
     * 数据库工具类
     * @author 
     */
    public class DbUtil {
     public Connection getCon() throws Exception{
      Class.forName("com.mysql.jdbc.Driver");
      Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/db_shiro", "root", "123456");
      return con;
     }
     public void closeCon(Connection con)throws Exception{
      if(con!=null){
       con.close();
      }
     }
     public static void main(String[] args) {
      DbUtil dbUtil=new DbUtil();
      try {
       dbUtil.getCon();
       System.out.println("数据库连接成功");
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       System.out.println("数据库连接失败");
      }
     }
    }

MyReaml类:继承shiro
AuthorizingReaml类,重写身份验证和权限验证两个方法。(这里也就解释了为什么访问student地址时,并未配置需要先登录,程序却自动跳转到登录面。因为底层封装了默认请求都先进行身份认证的方法。)  

    public class MyRealm extends AuthorizingRealm{
     private UserDao userDao=new UserDao();
     private DbUtil dbUtil=new DbUtil();
     /**
      * 为当前登录的用户授予角色和权限
      */
     @Override
     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
      String userName=(String)principals.getPrimaryPrincipal();
      SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
      Connection con=null;
      try{
       con=dbUtil.getCon();
       authorizationInfo.setRoles(userDao.getRoles(con,userName));
       authorizationInfo.setStringPermissions(userDao.getPermissions(con,userName));
      }catch(Exception e){
       e.printStackTrace();
      }finally{
       try {
        dbUtil.closeCon(con);
       } catch (Exception e) {
        e.printStackTrace();
       }
      }
      return authorizationInfo;
     }
     /**
      * 验证当前登录的用户
      */
     @Override
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
      String userName=(String)token.getPrincipal();
      Connection con=null;
      try{
       con=dbUtil.getCon();
       User user=userDao.getByUserName(con, userName);
       if(user!=null){
        AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUserName(),user.getPassword(),"xx");
        return authcInfo;
       }else{
        return null;
       }
      }catch(Exception e){
       e.printStackTrace();
      }finally{
       try {
        dbUtil.closeCon(con);
       } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
      return null;
     }

    }

这两个方法分别封装了一个身份信息实体类AuthenticationInfo
和AuthorizetionInfo返回。

首先获取用户信息,根据用户名查询数据库中的用户、权限等其他信息验证即可。整体流程是当浏览器访问例如:localhost:8080/shiro/admin
地址时,先调用loginServlet,在执行user.login方法时,进入自定义MyReaml类,获取用户信息,进行身份验证。  




http://www.bkjia.com/Javabc/1123006.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1123006.htmlTechArticleShiro权限认证 一、权限认证核心要素
权限认证顾名思义,就是在应用系统中,控制谁能访问哪些资源。核心要素有仨:权限、角色、用户...

### 相关文章

-   [如何通过VOIP内网评估获取域管理员权限?](http://www.bkjia.com/wzaq/1122972.html)
-   [MIUI
    ROM存在“篡权”漏洞可任意获取系统](http://www.bkjia.com/xtaq/1122201.html)
-   [ASP.NET
    MVC使用ActionFilterAttribute实现权限限](http://www.bkjia.com/Asp_Netjc/1120062.html)
-   [链家某重要站点任意文件上传导致getshe](http://www.bkjia.com/nwaq/1119449.html)
-   [postgresql学习--权限管理](http://www.bkjia.com/Sql_Server/1117765.html)
-   [Android6.0权限管理](http://www.bkjia.com/Androidjc/1116166.html)

**相关搜索:**
[权限](http://tech.bkjia.com/search.php?keyword=%E6%9D%83%E9%99%90&sub=articlefoot)

[](http://kansha.bkjia.com/)
今天看啥

[](http://tech.bkjia.com/)
搜索技术库

[](http://www.bkjia.com/)
*返回首页*

-   [如何通过VOIP内网评估获取域管理员权限?](http://www.bkjia.com/wzaq/1122972.html)
-   [Debian普通用户获取root权限|sudo的安装与配置,](http://www.bkjia.com/Linuxjc/1122699.html)
-   [Linux下Apache对Web页面的访问控制权限设置](http://www.bkjia.com/Linux/1122662.html)
-   [伙星怎么设置聊天权限](http://www.bkjia.com/sjjq/1122471.html)
-   [mysql远程访问的权限,mysql远程访问权限](http://www.bkjia.com/Mysql/1122332.html)
-   [MIUI
    ROM存在“篡权”漏洞可任意获取系统权限](http://www.bkjia.com/xtaq/1122201.html)

**相关频道:**
[Java编程](http://www.bkjia.com/fenlei/list-98-1.html)  [C#教程](http://www.bkjia.com/fenlei/list-99-1.html)  [C语言](http://www.bkjia.com/fenlei/list-100-1.html)  [C++教程](http://www.bkjia.com/fenlei/list-101-1.html)  [VC教程](http://www.bkjia.com/fenlei/list-102-1.html)  [Delphi教程](http://www.bkjia.com/fenlei/list-103-1.html)  [VB教程](http://www.bkjia.com/fenlei/list-104-1.html)  [工具软件](http://www.bkjia.com/fenlei/list-105-1.html)  

    权限:不怕需求被校验的一举一动,譬如查看、改良等。

 

     分配权限:把对一些安全实体的有些权柄分配给有个别人士。是向数据Curry面增添数据、或是维护数据的进程

一. Shiro是什么
Shiro是叁个Java平台的开源权限框架,用于表明和做客授权。具体来讲,满意对如下元素的帮助:

    权限验证(权限相配卡塔 尔(阿拉伯语:قطر‎:判别某一个人士或程序对有些安全实体是不是享有某些或有些权力。从数据库中拿到相应数据开展相配的长河。

  • 客商,剧中人物,权限(仅仅是操作权限,数据权限必需与专门的职业须要紧凑结合卡塔 尔(英语:State of Qatar),财富(url卡塔尔。
  • 顾客分配剧中人物,角色定义权限。
  • 做客授权时帮忙剧中人物要么权力,并且援救多元的权位定义。

    权力的世袭性:假定多个安全实体存在包蕴关系,而有个别安全实体未有权力限定,则它会持续包涵它的防城港实体的呼应权限。

Q:对组的支撑?
A:shiro暗中同意不援助对组织设立置权限。

    权限的近来非常原则:假若七个安全实体存在饱含关系,而有些安全实体未有权限限定,那么它会向上查找并协作影应权限约束,直到找到三个离这些安全实体近来的享有相应权限节制的平安实体结束。假诺把全副档案的次序结构都

Q:是还是不是足以满足对组进行剧中人物分配的要求?
A:扩大Realm,能够支撑对组实行分红剧中人物,其实正是给该组下的具备顾客分配权限。

寻找完了都未曾相称到对应权限约束以来,那就印证全部人对这些安全实体都富有这么些相应的权位限定。

Q:对数码权限的支撑? 在作业体系中定义?
A:shiro仅仅实现对操作权限的主宰,用于在前面三个调节作而成分隐敝或然展现,以至对财富访谈权限进行检查。数据权限与现实的工作须要紧密关联,shiro本人不大概落实对数据权限的主宰。

  Shiro 简介

  Apache Shiro 是三个有力易用的 Java 安全框架,提供了认证、授权、加密和对话管理等效果 。
    Shiro 能做怎么样 ???
      认证:证实客户的身价
      授权:对顾客实行访谈调节:判别顾客是不是被允许做有些事
      管理:在任哪个地方境下使用 Session API,固然未有 Web 或EJB 容器。
      加密:以更轻易易用的主意使用加密成效,爱抚或潜伏数据制止被盗窥
      Realms:会集一个或三个客户安全体据的数据源
      单点登陆(SSO卡塔尔功能:为未有涉嫌到登入的客商启用 "Remember Me“ 服务

Q:动态权限分配?
A:扩大org.apache.shiro.realm.Realm,援助动态权限分配。

  Shiro 的关键功能

图片 3

 

   

 

  Shiro 的四大骨干部分

    Authentication(身份验证):简单称谓为“登陆”,即注脚客户是什么人。

    Authorization(授权):访谈调控的进程,即决定是不是有权力去拜见受保障的能源。

    Session Management(会话管理):拘押顾客特定的对话,尽管在非 Web 或 EJB 应用程序。

    Cryptography(加密):通过应用加密算法保持数据安全

  shiro 还提供以下扩张:

    Web Support:根本针对web应用提供部分常用功效。

    Caching:缓存能够使应用程序运转更有效用。

    Concurrency:四线程相关职能。

    Testing:补助大家开展测验相关职能

    "Run As":三个允许客商如若为另一个顾客身份(假如同意)的成效,有的时候候在管制脚本很有用。

    "Remember Me" :纪事客商身份,提供相通购物车功用。

Q:与Spring集成?
A:能够帮衬与Spring集成,shiro还帮忙jsp标签。

Shiro 架构 3 个为主构件

 图片 4

 

  Subject :正与系统举行互相的人,或某一个第三方服务。全部 Subject 实例都被绑定到(且这是必得的卡塔 尔(英语:State of Qatar)叁个SecurityManager 上。

  SecurityManager:Shiro 架构的心脏,用来协和之中各安全组件,管理之中组件实例,并因而它来提供安全保管的各样劳动。当 Shiro 与叁个 Subject 实行人机联作时,实质上是背后的 SecurityManager 处理全部劳苦的

Subject 安全操作。

  Realms :真相上是多少个特虞升卿全的 DAO。当配置 Shiro 时,必需钦定至少贰个 Realm 用来实行身份验证或授权。Shiro 提供了多样可用的 Realms 来博取安全有关的数据。如关周全据库(JDBC),INI 及质量文件等。可以

概念自身 Realm 实现来表示自定义的数据源。

二. 系统架构
图片 5

本文由乐虎游戏发布于计算机资讯,转载请注明出处:Shiro权限认证

关键词:

203. Remove Linked List Elements,linkedelements

203. Remove Linked List Elements,linkedelements Remove all elements from a linked list of integers that havevalue  val . Example Given:  1 -- 2 -- ...

详细>>

汤姆cat配置虚构主机

Tomcat 设置二级域名 一、打开tomcat安装目录下conf/server.xml这个文件         在server.xml文档中找到 /Engine /Service 接着...

详细>>

linux文件同步

首先我的服务器端ip:192.168.122.129 配置rsync 同步数据 rpm包安装rsync及配置 客户端IP: 192.168.122.111 [root@Hammer home]# rpm -...

详细>>

Spring中的Bean配置方式

Spring基础——在Spring Config 文件中配置 Bean,springbean 一、基于 XML 的 Bean 的配置 1.通过属性注入 即通过 setXxx() 方法注...

详细>>