zoukankan      html  css  js  c++  java
  • shiro认证

    1.新建maven项目,导入shiro的jar包
    
    <!--导入shiro依赖的commons-loggin的jar包-->
    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.0.4</version>
    </dependency>
    <!--导入shiro的jar包-->
    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.2.3</version>
    </dependency>
    
    
    2.创建shiro的认证文件
    
    #声明用户的对象
    [users]
    #=号前面是用户名 后面是密码
    zhang=123456
    li=654321
    
    3、进行测试
    
    package com.aaa.test;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.IncorrectCredentialsException;
    import org.apache.shiro.authc.UnknownAccountException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    
    public class ShiroTest01 {
        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);
            //获取验证的主题,当前主题是用户对象
            Subject subject = SecurityUtils.getSubject();
            //声明要比对的用户名和密码的用户对像,相当于之前前台传过来的要校验的登录信息
            UsernamePasswordToken token=new UsernamePasswordToken("张三","123456");
    
            try{
                //进行用户校验
                subject.login(token);
                System.out.println("校验成功");
            }catch(UnknownAccountException e){
                System.out.println("您输入的用户名不存在");
            }catch (IncorrectCredentialsException e){
                System.out.println("您输入的密码不存在");
            }catch(AuthenticationException e){
                System.out.println("校验失败");
            }
        }
    }
    还可以自定义realm文件
    
    package com.aaa.realm;
    
    import org.apache.shiro.authc.*;
    import org.apache.shiro.realm.Realm;
    
    public class MyRealm implements Realm {
        /**
         * 设置本realm的名字
         * @return
         */
        public String getName() {
            return "myRealm";
        }
    
        //设置本realm支持什么样的数据校验
        public boolean supports(AuthenticationToken authenticationToken) {
            return authenticationToken instanceof UsernamePasswordToken;
        }
    
        //获取认证信息
        public AuthenticationInfo getAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
           //获取用户传过来的用户名和密码
            String username =(String) authenticationToken.getPrincipal();
            char[] credentials = (char[]) authenticationToken.getCredentials();
            String password=new String(credentials);
            //根据用户名和密码查询数据库看看能不能查询到数据
            if (username.equals("张三")&&password.equals("123456")){
                return new SimpleAuthenticationInfo(username,password,this.getName());
            }else{
                //校验失败
                throw new AuthenticationException("用户名或者密码错误");
            }
    
        }
    }
    
    
    2、在shiro的主配置文件中声明自定义的realm
    
    #声明自定义的realm
    myRealm=com.aaa.realm.MyRealm
    #设置安全管理器使用我们自定义的realm
    securityManager.realms=$myRealm
    
    
    3.测试
    package com.aaa.test;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    
    public class ShiroTest02 {
        public static void main(String[] args) {
            //获取SecurityManager的工厂类对象
            Factory<SecurityManager> factory= new IniSecurityManagerFactory("classpath:shiro-custom.ini");
            //获取SecurityManage对象
            SecurityManager securityManager = factory.getInstance();
            //把securityManager对像存储到securityUtil对象中
            SecurityUtils.setSecurityManager(securityManager);
            //获取主题对象  也就是当前用户
            Subject subject = SecurityUtils.getSubject();
            //声明要比较的用户名和密码
            UsernamePasswordToken token=new UsernamePasswordToken("张三","123456");
    
            try{
                subject.login(token);
                System.out.println("登录成功");
            }catch (AuthenticationException e){
                System.out.println("登录失败");
            }
    
            //退出登录
            subject.logout();
    
        }
    }
    三、jdbcRealm
    
    需要导入oracle和dbcp的jar包数据库中要有表

    #声明数据源 dataSource
    =org.apache.commons.dbcp.BasicDataSource #声明数据源的一些连接属性 dataSource.driverClassName=oracle.jdbc.driver.OracleDriver dataSource.url=jdbc:oracle:thin:@localhost:1521:orcl dataSource.username=scott dataSource.password=tiger #声明jdbcrealm jdbcrealm=org.apache.shiro.realm.jdbc.JdbcRealm #声明jdbcrealm需要用到的数据源属性 jdbcrealm.dataSource=$dataSource #设置安全管理器使用的jdbcrealm securityManager.realms=$jdbcrealm 测试 package com.aaa.test; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; public class ShiroTest03 { public static void main(String[] args) { //获取SecurityManager的工厂类对象 Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-jdbcrealm.ini"); //获取SecurityManager对象 SecurityManager securityManager = factory.getInstance(); //把securityManager对象设置到SecurityUtils对象中 SecurityUtils.setSecurityManager(securityManager); //获取当前主题,即当前对象 Subject subject = SecurityUtils.getSubject(); //传入要验证的用户名和密码 UsernamePasswordToken token=new UsernamePasswordToken("张三","123456"); try{ subject.login(token); System.out.println("验证成功"); }catch (AuthenticationException e){ System.out.println("校验失败"); } } }
  • 相关阅读:
    URAL 2067 Friends and Berries (推理,数学)
    URAL 2070 Interesting Numbers (找规律)
    URAL 2073 Log Files (模拟)
    URAL 2069 Hard Rock (最短路)
    URAL 2068 Game of Nuts (博弈)
    URAL 2066 Simple Expression (水题,暴力)
    URAL 2065 Different Sums (找规律)
    UVa 1640 The Counting Problem (数学,区间计数)
    UVa 1630 Folding (区间DP)
    UVa 1629 Cake slicing (记忆化搜索)
  • 原文地址:https://www.cnblogs.com/qurui1998/p/11129254.html
Copyright © 2011-2022 走看看