当前位置: 首页 > news >正文

Shrio入门

文章目录

    • 登录认证
    • 角色、授权
    • shiro加密
    • Shrio自定义登录认证

1、引入依赖

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.9.0</version>
</dependency>

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

2、创建shiro.ini文件

Shiro获取权限相关信息可以通过数据库获取,也可以通过ini配置文件获取,这里演示配置文件

设定账号和密码

[users]
zhangshan=123
lisi=123

登录认证

概念:在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份

最常见的principals和credentials组合就是账号+密码

public class shirotest {
    public static void main(String[] args) {
        //1、初始化获取SecurityManager
        IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        //2、获取Subject对象
        Subject subject = SecurityUtils.getSubject();

        //3、创建token对象,web应用用户名密码从页面传递
        AuthenticationToken token=new UsernamePasswordToken("zhangsan","123");

        //4、完成登录
        subject.login(token);
        //没有抛异常就是登录成功
        try {
            System.out.println("登录成功");
        } catch (UnknownAccountException e) {
            e.printStackTrace();
            System.out.println("用户不存在");
        }
        catch (IncorrectCredentialsException e){
            e.printStackTrace();
            System.out.println("密码错误");
        }

    }
}

角色、授权

在shiro.ini中添加角色和对应的权限

[users]
zhangsan=123,role1,role2
lisi=123

[roles]
role1=user:insert,user:select

进行角色的判断和权限的判断

public class shirotest {
    public static void main(String[] args) {
        //1、初始化获取SecurityManager
        IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        //2、获取Subject对象
        Subject subject = SecurityUtils.getSubject();

        //3、创建token对象,web应用用户名密码从页面传递
        AuthenticationToken token=new UsernamePasswordToken("zhangsan","123");


        //没有抛异常就是登录成功
        try {
            //4、完成登录
            subject.login(token);
            System.out.println("登录成功");
            //5、判断角色是否存在
            boolean hasRole = subject.hasRole("role1");
            System.out.println("是否拥有此角色:"+hasRole);
            //6、判断权限--也可以使用checkPermission方法,但是没有返回值,没有权限抛出AuthenticationException异常

            boolean permitted = subject.isPermitted("user:insert");
            System.out.println("是否有user:insert权限:"+permitted);



        } catch (UnknownAccountException e) {
            e.printStackTrace();
            System.out.println("用户不存在");
        }
        catch (IncorrectCredentialsException e){
            e.printStackTrace();
            System.out.println("密码错误");
        }

    }
}

shiro加密

Shiro内嵌很多常用的加密算法,比如MD5加密

public class ShiroMD5 {

    public static void main(String[] args) {
        //加密
        String password="123";
//使用md5加密
        Md5Hash md5Hash=new Md5Hash(password);
        System.out.println(md5Hash);

//带盐的md5加密
        Md5Hash md5Hash2=new Md5Hash(password,"salt");
        System.out.println(md5Hash2);
//多次迭代加密
        Md5Hash md5Hash3=new Md5Hash(password,"salt",3);
        System.out.println(md5Hash3);

        //使用父类进行加密
        SimpleHash simpleHash=new SimpleHash("MD5",password,"salt",3);
        String s = simpleHash.toHex();
        System.out.println(s);
    }
}

Shrio自定义登录认证

创建MyRealm类继承AuthenticatingRealm

1、自定义登录认证方法,shiro的login方法的底层会调用该类的认证方法进行认证
2、需要配置自定义的realm生效,在ini文件中可以配置,在springboot中可以配置
3、该方法只是获取进行比对的信息,认证逻辑还是按照shiro底层逻辑认证完成

public class MyRealm extends AuthenticatingRealm {

    //自定义登录认证方法,shiro的login方法的底层会调用该类的认证方法进行认证
    //需要配置自定义的realm生效,在ini文件中可以配置,在springboot中可以配置
    //该方法只是获取进行比对的信息,认证逻辑还是按照shiro底层逻辑认证完成

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //1、获取身份信息
        String principal = authenticationToken.getPrincipal().toString();
        //2、获取凭证信息
        String password=new String((char[]) authenticationToken.getCredentials());
        //3、访问一下数据库获取用户信息(模拟)
        System.out.println(principal+password);
        if (principal.equals("zhangsan")){
            //获取出数据库中存储的加盐3次迭代密码,这里是123
            String pwd="07ca00e10899418f0ea4ab92a9d69065";
            //4、创建封装校验逻辑对象,封装数据返回
            //身份信息,密码信息,
            AuthenticationInfo info=new SimpleAuthenticationInfo(
                    authenticationToken.getPrincipal(),//身份信息
                    pwd,//加密后的密码
                    ByteSource.Util.bytes("salt"),//加密的盐
                    authenticationToken.getPrincipal().toString()
            );
            return info;
        }



        return null;
    }
}

这里是使用ini文件进行配置

在shiro.ini中添加

[main]
md5CredentialsMatcher=org.apache.shiro.authc.credential.Md5CredentialsMatcher
md5CredentialsMatcher.hashIterations=3

myrealm=com.atguigu.MyRealm  //MyRealm类所在位置
myrealm.credentialsMatcher=$md5CredentialsMatcher
securityManager.realms=$myrealm

相关文章:

  • 安阳网站建设/南京网络建站公司
  • 国内做网站哪个好/友链交易交易平台
  • 淘宝买网站开发不行吗/泾县网站seo优化排名
  • 我想做直播网站该怎么做/搜索引擎优化排名关键字广告
  • 进行网站开发 如何搭建环境/seo整站优化多少钱
  • wordpress手机版菜单/网站优化关键词公司
  • 创新永恒的华为HDC
  • Nacos 在Spring Boot中使用
  • 多源传感器组合导航 GNSS 视觉SLAM LiDAR INS 开源项目总结
  • Idea 报Error:java:无效的源发行版13
  • 【蓝桥杯选拔赛真题53】Scratch破解保险柜 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解
  • 数据库管理-第四十九期 Exadata的存储节点管理(20221223)
  • Activity
  • 3.1 多集放大电路的耦合方式
  • 日本知名汽车零部件公司巡礼系列之株式会社135
  • qt5实现pdf阅读器(三)——pdfjs
  • SpringBoot:模块探究之spring-boot-devtools
  • python+pyqt5+mysql设计图书管理系统(5)- 普通用户图书管理界面