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

来源:互联网 发布:视频录制软件电脑 编辑:程序博客网 时间:2024/06/06 12:33

这次的笔记是写的 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配置文件创建securityManager2、调用subject.login方法主体提交认证,提交的token3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。4、ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息5、IniRealm根据输入的token(UsernamePasswordToken)从 shiro.ini查询用户信息,根据账号查询用户信息(账号和密码)         如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)         如果查询不到,就给ModularRealmAuthenticator返回null6、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();// 配置当前的环境是上面创建的securityManagerSecurityUtils.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 不是就返回一个falseboolean flag = subject.isAuthenticated();System.out.println("已登录:"+flag);// 退出subject.logout();flag = subject.isAuthenticated();System.out.println("已登录:"+flag);}}

OK...

阅读全文
0 0