您的位置:首页 > 编程语言 > Java开发

java鬼混笔记:shiro 1、基本ini配置文件的登录认证

2017-08-27 16:01 615 查看
这次的笔记是写的 shiro的第一个简单的例子,基本ini配置文件的登录验证。

什么是shiro这个百度百科就有了,这里不多说了。shiro登录验证程序怎么跑了,根据我在网上找的和自己点点点源码看到的总结一下,其他和网友的的说法差不多,我这就直接复制别人的啦;

这个部分转自于:http://blog.csdn.net/mine_song/article/details/61616259
subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。

securityManager:安全管理器,主体进行认证和授权都是通过securityManager进行。

authenticator:认证器,主体进行认证最终通过authenticator进行的。

authorizer:授权器,主体进行授权最终通过authorizer进行的。

sessionManager:web应用中一般是用web容器对session进行管理,shiro也提供一套session管理的方式。
SessionDao:  通过SessionDao管理session数据,针对个性化的session数据存储需要使用sessionDao。

cache Manager:缓存管理器,主要对session和授权数据进行缓存,比如将授权数据通过cacheManager进行缓存管理,和ehcache整合对缓存数据进行管理。

realm:域,领域,相当于数据源,通过realm存取认证、授权相关数据

1、通过ini配置文件创建securityManager
2、调用subject.login方法主体提交认证,提交的token
3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。
4、ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息
5、IniRealm根据输入的token(UsernamePasswordToken)从 shiro.ini查询用户信息,根据账号查询用户信息(账号和密码)
如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
如果查询不到,就给ModularRealmAuthenticator返回null
6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息
如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException)
如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)
和 token中的密码 进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)


转的文章里也有授权流程说明 , 不过这里只主验证的先,不说了,上代码,跟着上面的流程走。。。

先设置ini配置文件的打开方式,不然会弹出系统的编辑方式:eclipse-window-General-Editors-File Associations,找到*.ini,设置成Properties File Editor(default),如下图



好,先创建一个maven项目,结构如下图:



pom.xml(人懒就直接 shiro-all...)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>

<groupId>com.ywj</groupId>
<artifactId>TestShiro</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>TestShiro</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-all -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.3.2</version>
<type>pom</type>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3</version>
</dependency>

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>

</dependencies>
</project>


接着创建一个shiro_base.ini文件,我放在config/目录下,习惯了,公司也是这么放的,打开shiro_base.ini,写点东西,如下图:



提醒一下.ini文件的注释是 以;号开始的

开始测试认证

Test.java

package com.ywj.TestShiro;

import org.apache.shiro.SecurityUtils;
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 Test {

public static void main(String[] args) {

// 先创建一个SecurityManager环境
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:config/shiro_base.ini");// 对应config 下面的base_shiro.ini文件

// 得到一个securityManager实例
SecurityManager securityManager = factory.getInstance();
// 配置当前的环境是上面创建的securityManager
SecurityUtils.setSecurityManager(securityManager);

// 创建一个subject, 访问当前系统的一个主体
Subject subject = SecurityUtils.getSubject();
// 一个token, 这个token的参数是 账号(ywj)和密码(888),用户登录或其他操作输入的账号和密码
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("ywj", "888");

try {

// subject进行认证
subject.login(usernamePasswordToken);
} catch (UnknownAccountException e) {
System.out.println("用户不存在");
} catch (IncorrectCredentialsException e) {
System.out.println("密码不正确");
} catch (Exception e) {
e.printStackTrace();
}
// 是否已登录 , 是返回一个true 不是就返回一个false
boolean flag = subject.isAuthenticated();
System.out.println("已登录:"+flag);
// 退出
subject.logout();
flag = subject.isAuthenticated();
System.out.println("已登录:"+flag);
}

}


OK...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: