zoukankan      html  css  js  c++  java
  • 固定Realm 与配置数据库连接实现登录验证

    1. 具体内容

      在之前的shiro的认证都是基于配置文件完成的,但是在整个shiro之中,对于用户的认证信息可能各种途径,那么在shiro中要想实现从不同的途径中取得用户的身份认证就需要Realm了。

    2. 认识Realm

      shiro里面考虑到以后可能需要面对不同的数据来源,所以为了统一这些来源的处理,准备了一个Realm的接口。先来观察这个org.apache.shiro.realm.Realm接口的定义:

    public interface Realm {

    //只是要求返回一个当前使用的Realm名字,这个名字可以任意返回,但是不能重名

    public String getName() ;

    //判断当前使用的Token的类型是否为指定的类型

    public boolean supports(AuthenticationToken token) ;

    //得到用户的认证信息,根据传入的Token取得;

    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws

    AuthenticationException

    }

    1. 固定信息Realm认证

      如果要想使用Realm操作,那么必须要保证有一个具体的认证实现类实现了Realm接口。

      1. 建立一个MyRealm子类,该类实现Realm接口,覆写该接口方法:

        A)认证信息:org.apache.shiro.authc.AuthenticationInfo,接口有两个方法:

            取得所有的身份信息:public PrincipalCollection getPrincipals()

            取得认证信息:public Object getCredentials()

             B)子类:org.apache.shiro.authc.SimpleAuthenticationInfo

                    构造方法:public SimpleAuthenticationInfo(Object principal, Object credentials, String realmName)

             C)所有用户的信息都保存在token里面:org.apache.shiro.authc.AuthenticationToken,此接口定义有两个方法

                取得身份数据:public Object getPrincipal()

    取得认证数据:public Object getCredentials()

    范例:实现自定义Realm

    public class MyRealm implements Realm {

        @Override

        public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

            String username=(String)token.getPrincipal();//取得用户名

            String password=new String((char[])token.getCredentials());//取得密码

            if(!"admin".equals(username)){

                throw new UnknownAccountException("用户名不存在");

            }

            if(!"hello".equals(password)){

                throw new IncorrectCredentialsException("密码输入错误");

            }

            return new SimpleAuthenticationInfo(username,password,this.getName());

        }

        @Override

        public String getName() {

            // TODO Auto-generated method stub

            return "MyRealm";

        }

        @Override

        public boolean supports(AuthenticationToken token) {

            // TODO Auto-generated method stub

            return token instanceof UsernamePasswordToken;

        }

    }

        如果现在希望realm配置生效,则需要在配置文件里面进行相关的定义。

    shir.ini中配置一下信息:

    myRealm=cn.mldn.realm.MyRealm

    # 整个shiro 中的验证处理都是由SecurityManager接口负责的

    securityManager.realms=$myRealm

    注意:如果有多个Realm时,可以在securityMember.realm后面设置,中间使用"

    隔开;

    执行测试类TestLoginDemo测试Realm

    public class TestLoginDemo {

     

        public static void main(String[] args) {

            // TODO Auto-generated method stub

            Factory<org.apache.shiro.mgt.SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");

            SecurityManager securityManager=factory.getInstance();

            SecurityUtils.setSecurityManager(securityManager);

            Subject subject=SecurityUtils.getSubject();

            UsernamePasswordToken token=new UsernamePasswordToken("admi", "hllo");

            subject.login(token);

            System.out.println(subject.getPrincipal());

            System.out.println(subject.getSession());

        }

    }

    1. 基于数据库的验证处理

      建立一张数据表,而后基于数据库的实现数据的认证处理操作。

      1)、建立member表:

    DROP DATABASE IF EXISTS shirodb ;

    CREATE DATABASE shirodb CHARACTER SET UTF8 ;

    USE shirodb ;

    CREATE TABLE member (

    mid VARCHAR(50),

    password VARCHAR(32),

    name VARCHAR(20),

    locked INT,

    CONSTRAINT pk_mid PRIMARY KEY (mid)

    ) type = innodb;

    INSERT INTO member(mid,password,name,locked) VALUES ('admin','hello',' ',0) ;

    INSERT INTO member(mid,password,name,locked) VALUES ('mermaid','hello',' ',0) ;

    INSERT INTO member(mid,password,name,locked) VALUES ('mldn','java',' ',0) ;

    2)由于项目中需要使用到mysql数据库,使用需要在pom.xml中配置以下sql驱动程序:

    <dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>5.0.8</version>

    </dependency>

    3)本次的处理操作所有的核心配置都不是通过程序完成的,都是通过配置文件完成的,本次直接使用MYSQL提供好的数据库连接池进行配置。

    修改shiro.ini文件:

    [main]

    #定义本次mysql连接要使用的数据源处理类

    dataSource=com.mysql.jdbc.jdbc2.optional.MysqlDataSource

    #定义数据库的连接主机名字

    dataSource.serverName=127.0.0.1

    #定义要使用的数据库的名字

    dataSource.databaseName=shirodb

    #定义数据库的连接账户

    dataSource.user=root

    #定义数据库连接密码

    dataSource.password=mysqladmin

     

    #定义本次要基于jdbc实现的Realm的认证配置类

    jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm

    #配置本次的jdbc连接所使用的数据源,$表示引用配置

    jdbcRealm.dataSource=$dataSource

    #

    jdbcRealm.authenticatonQuery=select password from member where mid=?

     

    #配置安全管理器所使用的Realm

    securityManager.realms=$jdbcRealm

    配置完成后直接执行之前的测试方法类便可进行用户的登录检测了。

    public class TestLoginDemo {

        public static void main(String[] args) {

            // TODO Auto-generated method stub

            Factory<org.apache.shiro.mgt.SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro.ini");

            SecurityManager securityManager=(SecurityManager) factory.getInstance();

            SecurityUtils.setSecurityManager((org.apache.shiro.mgt.SecurityManager) securityManager);

            Subject subject=SecurityUtils.getSubject();

            UsernamePasswordToken token=new UsernamePasswordToken("admin", "hello");

            subject.login(token);

            System.out.println(subject.getPrincipal());

        }

    }

  • 相关阅读:
    主流配置中心的比较 Spring Cloud Config、Apollo、Nacos
    css进阶之路(一)----Web标准
    hello world
    服务过美国总统竞选的非传统投票UI [解析及DEMO]
    服务过美国总统竞选的非传统投票UI【demo已放出】
    大公司移动前端开发面试题——做转盘[参考代码]
    大公司移动前端开发面试题——做转盘[参考代码已放出]
    【前端杂谈】细数前端优化的化零为整
    前端开发的七宗罪
    CentOS7环境下在/离线安装GCC与GCC-C++
  • 原文地址:https://www.cnblogs.com/jjyz/p/5988869.html
Copyright © 2011-2022 走看看