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. Hibernate中调用带有underscore的Column Name

    Hibernate中默认的NamingStrategy不支持调用带有下划线的column name.在hibernate的bean中必须使用camel case.使用ImprovedNamingStr ...

  2. 关于bootstrap table 的可编辑列表的实例

    最近被安排到一个新的项目里,首先被分配了一个成果管理的模块,虽然是简单的增删改查,但是也费了不少功夫. 其中耽误最长的时间就是form中嵌套了两个可编辑列表的子表.废话不说上干货 = = 参考资料 1 ...

  3. 开涛spring3(7.3) - 对JDBC的支持 之 7.3 关系数据库操作对象化

    7.3.1  概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...

  4. More 3D Graphics (rgl) for Classification with Local Logistic Regression and Kernel Density Estimates (from The Elements of Statistical Learning)(转)

    This post builds on a previous post, but can be read and understood independently. As part of my cou ...

  5. js的for循环闭包问题

    一个简单的例子,如果想循环输出数组中的每一个数值我们可以利用for循环来输出例如: <script type="text/javascript"> var arr=[& ...

  6. PHP中的面向对象OOP中的魔术方法

    一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在ne ...

  7. PHP·笔记(函数总结)

    PHP 指 PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名) PHP 是一种服务器端的脚本语言,类似 ASP PHP 脚本在服务器上执行 PHP 支持 ...

  8. linux exec操作文件描述符

    linux每一个打开文件都会关联一个文件描述符,需要的时候我们可以使用exec命令指定一个大于3的数字作为文件 linux默认文件描述符 每打开一个shell就会打开默认的三个文件描述符描0,1,2, ...

  9. python http长连接客户端

    背景: 线上机器,需要过滤access日志,发送给另外一个api 期初是单进程,效率太低,改为多进程发送后,查看日志中偶尔会出现异常错误(忘记截图了...) 总之就是端口不够用了报错 原因: 每一条日 ...

  10. CSS3学习系列之选择器(三)

    E:enabled伪类选择器和E:disabled伪类选择器 E:enabled伪类选择器用来指定元素处于可用状态的样式. E:disabled伪类选择器用来指定当元素处于不可用状态时的样式. 当一个 ...