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
)由于项目中需要使用到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());

}

}

固定Realm 与配置数据库连接实现登录验证的更多相关文章

  1. 图解如何在Linux上配置git自动登录验证

    记录一下配置git操作远程仓库时的自动验证,效果如下图: 本文介绍的是Linux下的配置.Windows上默认已经启用凭证存储和自动验证(依靠wincred实现,以后会使用GCM-Core). 准备工 ...

  2. centos7: svbversion版本的安装配置+tortoisesvn登录验证

    centos7: svbversion版本的安装配置+tortoisesvn登录验证 命令工具:svnadmin create #创建版本库 hotcopy #版本库热备份 Islocks #打印所有 ...

  3. 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)

    前言: shiro因为其简单.可靠.实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一 ...

  4. 使用nginx代理kibana并配置登录验证

    由于kibana不支持登录验证,谁都可以访问,放到公网就不合适了,这里配置用nginx进行代理: 生成密码文件 如果安装了httpd可以用htpasswd,比较方便: htpasswd -c /roo ...

  5. web14 validation.xml配置 登录验证文件配置

    电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...

  6. Shiro安全框架入门篇(登录验证实例详解与源码)

    转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...

  7. Web.config配置数据库连接

    web.config配置数据库连接   第一种:取连接字符串 string connString = System.Web.Configuration.WebConfigurationManager. ...

  8. java桥连接sql server之登录验证及对数据库增删改查

    一:步骤 1.sql server建立数据库和相关表 2.建立数据源  (1).打开控制面板找到管理,打开ODBC选项或直接搜索数据源  (2).打开数据源配置后点击添加,选择sql server点击 ...

  9. 基于权限安全框架Shiro的登录验证功能实现

    目前在企业级项目里做权限安全方面喜欢使用Apache开源的Shiro框架或者Spring框架的子框架Spring Security. Apache Shiro是一个强大且易用的Java安全框架,执行身 ...

随机推荐

  1. Nginx教程(三) Nginx日志管理

    Nginx教程(三) Nginx日志管理 1 日志管理 1.1 Nginx日志描述 通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某 ...

  2. 开涛spring3(8.1) - 对ORM的支持 之 8.1 概述

    8.1  概述 8.1.1  ORM框架 ORM全称对象关系映射(Object/Relation Mapping),指将Java对象状态自动映射到关系数据库中的数据上,从而提供透明化的持久化支持,即把 ...

  3. React介绍(讲人话)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 21.0px "PingFang SC"; color: #616161 } span. ...

  4. sublime工具篇

    sublime快捷键的应用 熟悉掌握sublime快捷键,提高编码效率,享受编码乐趣. window操作系统常用快捷键 win+D:快速显示桌面     win+方向键:最大化最小化窗口  win+L ...

  5. iOS安全攻防之代码混淆

    iOS 代码安全之代码混淆实践: 前言: 在8月份的时候写了个关于 class-dump 反编译的文章(使用 Class-dump 反编译),利用 class-dump 工具可以反编译出工程的头文件, ...

  6. NetBeans+Xdebug调试php代码

    本文目录 : Xdebug的工作原理 Xdebug扩展的配置 NetBeans的配置 调试实例 本文小结 参考文档 Xdebug:是PHP的调试器和分析器(Debugger and Profiler ...

  7. python3-如何正常使用HTMLTestRunner.py,生成自动化测试报告

    其实HTMLTestRunner.py是基于python2开发的,为了使其支持python3环境,需要对其的部分内容进行修改.下面我们通过编辑器打开HTMLTestRunner.py文件(编辑器可以选 ...

  8. java基础(八章)

    一.        什么是数组及其作用? 定义:具有相同数据类型的一个集合 作用:存储连续的具有相同类型的数据 二.        java中如何声明和定义数组 l  声明和定义的语法: 数据类型[ ...

  9. vscode中使用markdown

    vscode中使用markdown vscode 是微软推出一款轻量级的文本编辑工具,类似于sublime,由于其拥有丰富的插件,安装使用也非常简单,所以深受广大程序员的喜爱. markdown 是一 ...

  10. javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...