固定Realm 与配置数据库连接实现登录验证
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了固定Realm 与配置数据库连接实现登录验证相关的知识,希望对你有一定的参考价值。
- 具体内容
在之前的shiro的认证都是基于配置文件完成的,但是在整个shiro之中,对于用户的认证信息可能各种途径,那么在shiro中要想实现从不同的途径中取得用户的身份认证就需要Realm了。
- 认识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 } |
- 固定信息Realm认证
如果要想使用Realm操作,那么必须要保证有一个具体的认证实现类实现了Realm接口。
- 建立一个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)、建立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()); } } |
以上是关于固定Realm 与配置数据库连接实现登录验证的主要内容,如果未能解决你的问题,请参考以下文章
springboot项目中使用shiro实现用户登录以及权限的验证