shiro之自定义realm
- Shiro认证过程
- 创建SecurityManager---》主体提交认证---》SecurityManager认证---》Authenticsto认证---》Realm验证
- Shiro授权过程
- 创建SecurityManager---》主体授权---》ecurityManager授权---》Authorizer授权---》Realm获取角色权限数据
1.pom.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <parent>
- <artifactId>ylht-shiro</artifactId>
- <groupId>com.ylht</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>shiro-test</artifactId>
- <dependencies>
- <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shiro-core</artifactId>
- <version>1.4.0</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/junit/junit -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.7</version>
- <scope>test</scope>
- </dependency>
- <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.45</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid</artifactId>
- <version>1.1.6</version>
- </dependency>
- </dependencies>
- </project>
2.自定义realm(自定义realm可以的编写可以参考源码)
- package com.ylht.shiro.realm;
- import org.apache.shiro.authc.AuthenticationException;
- import org.apache.shiro.authc.AuthenticationInfo;
- import org.apache.shiro.authc.AuthenticationToken;
- import org.apache.shiro.authc.SimpleAuthenticationInfo;
- import org.apache.shiro.authz.AuthorizationInfo;
- import org.apache.shiro.authz.SimpleAuthorizationInfo;
- import org.apache.shiro.realm.AuthorizingRealm;
- import org.apache.shiro.subject.PrincipalCollection;
- import org.apache.shiro.util.ByteSource;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Map;
- import java.util.Set;
- public class CustomerRealm extends AuthorizingRealm {
- {
- super.setName("customRealm");
- }
- //该方法用来授权
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
- //1.从认证信息中获取用户名
- String username = (String) principalCollection.getPrimaryPrincipal();
- //2.从数据库或者缓存中获取用户角色数据
- Set<String> roles = getRolesByUserName(username);
- //3.从数据库或者缓存中获取用户权限数据
- Set<String> permissions = getPermissionsByUserName(username);
- SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
- simpleAuthorizationInfo.setRoles(roles);
- simpleAuthorizationInfo.setStringPermissions(permissions);
- return simpleAuthorizationInfo;
- }
- //该方法用来认证
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
- //1.从认证信息中获取用户名
- String username = (String) authenticationToken.getPrincipal();
- //2.通过用户名到数据库中获取凭证
- String password = getPwdByUserName(username);
- if (null == password) {
- return null;
- }
- SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
- username, password, "customRealm");
- simpleAuthenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("zzz"));
- return simpleAuthenticationInfo;
- }
- //模拟数据库
- private String getPwdByUserName(String username) {
- Map<String, String> userMap = new HashMap<String, String>(16);
- userMap.put("kk", "bdd170a94d02707687abc802b2618e19");
- return userMap.get(username);
- }
- //模拟数据库
- private Set<String> getRolesByUserName(String username) {
- Set<String> sets = new HashSet<String>();
- sets.add("admin");
- sets.add("user");
- return sets;
- }
- //模拟数据库
- private Set<String> getPermissionsByUserName(String username) {
- Set<String> sets = new HashSet<String>();
- sets.add("user:select");
- sets.add("user:update");
- return sets;
- }
- }
3.测试类(加密方式,盐等)
- package com.ylht.shiro.test;
- import com.ylht.shiro.realm.CustomerRealm;
- import org.apache.shiro.SecurityUtils;
- import org.apache.shiro.authc.UsernamePasswordToken;
- import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
- import org.apache.shiro.authz.AuthorizationException;
- import org.apache.shiro.crypto.hash.Md5Hash;
- import org.apache.shiro.mgt.DefaultSecurityManager;
- import org.apache.shiro.subject.Subject;
- import org.junit.Test;
- public class CustomRealmTest {
- @Test
- public void testCustomRealm() {
- //创建JdbcRealm对象
- CustomerRealm customerRealm = new CustomerRealm();
- //设置JdbcRealm属性
- //1.创建SecurityManager对象
- DefaultSecurityManager securityManager = new DefaultSecurityManager();
- //securityManager对象设置realm
- securityManager.setRealm(customerRealm);
- //shiro加密
- HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
- //加密方式
- matcher.setHashAlgorithmName("md5");
- //加密次数
- matcher.setHashIterations(2);
- //customerRealm设置matcher
- customerRealm.setCredentialsMatcher(matcher);
- //2.主题提交认证
- SecurityUtils.setSecurityManager(securityManager);
- Subject subject = SecurityUtils.getSubject();
- //token
- UsernamePasswordToken token = new UsernamePasswordToken("kk", "123456", false);
- //认证
- subject.login(token);
- boolean flag = subject.isAuthenticated();
- if (flag) {
- System.out.println("用户认证通过");
- } else {
- System.out.println("用户认证失败");
- }
- //角色验证
- try {
- subject.checkRole("admin");
- System.out.println("角色验证通过");
- } catch (AuthorizationException e) {
- System.out.println("角色验证失败");
- e.printStackTrace();
- }
- //角色权限验证
- try {
- subject.checkPermission("user:select");
- System.out.println("角色权限验证通过");
- } catch (AuthorizationException e) {
- System.out.println("角色权限验证失败");
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- //Md5Hash md5Hash = new Md5Hash("123456","zzz");
- Md5Hash md5Hash = new Md5Hash("123456");
- System.out.println(md5Hash);
- Md5Hash md5Hash1 = new Md5Hash(md5Hash);
- System.out.println(md5Hash1.toString());
- }
- }
shiro之自定义realm的更多相关文章
- shiro中自定义realm实现md5散列算法加密的模拟
shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...
- shiro(二)自定义realm,模拟数据库查询验证
自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...
- Shiro -- (三) 自定义Realm
简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...
- 6、Shiro之自定义realm
1.创建一个包存放我们自定义的realm文件: 创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写: CustomRea ...
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
先来看问题 纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...
- (十)shiro之自定义Realm以及自定义Realm在web的应用demo
数据库设计 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...
- 权限框架 - shiro 自定义realm
上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的 首先创建自定义realm文件,如下: 在shiro中注入自定义realm的完全限定类名: ...
- Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】
什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...
- shiro自定义Realm
1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...
随机推荐
- HTML初体验
ios讨论群1群:135718460 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,它规定了自己的语法规则,用来表示比"文本"更丰富 ...
- Thread Runnable 区别
[线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(co ...
- InspectIT_EUM 实现原理概述
在Git上查看 InspectIT 实现原理概述: 实现原理详解: 1.jsAgent如何注入到浏览器 通过ASM框架修改HttpService.service()方法,加入相关逻辑,对每一个Htt ...
- MongoDB and Redis
简介 MongoDB更类似MySQL,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询JSON数据,能存储海量数据,但是不支持事务. Mysql在大数据量时效率显著下降,MongoDB更多 ...
- 推断View是否显示在界面上
我们都知道ViewController有viewWillAppear和viewDidAppear等关于页面生命周期的方法,用来对视图做一些管理,比方页面出现时怎么样,页面消失时怎么样.. 可是对于Vi ...
- safi 中placeholder不垂直居中
用css hack将line-height 设置为1 例子: input{height: 32px; line-height: 32px; [;line-height: 1px;]};
- 【Selenium】Action.moveToElement
使用moveToElement可是实现定位焦点,尝试后测试通过,代码如下 //鼠标单击前商品信息被隐藏,我们需要手动除展示商品标签的隐藏属性 JavascriptExecutor ...
- 书写优雅的shell脚本(插曲)- ed编辑器
今天发现了一个灰常好用的unix/linux文本行编辑器:ed,对于进行面向行的文本编辑工作她真是太棒了,比vi操作简单.方便.功能强大.感兴趣的同仁可以尝试一下!
- LA-2678 (尺取法)
题意: 在一个长度为n的序列中,找到最短的长度序列,使其和大于等于s; 思路: two pointer ,水题; Ac代码: #include <bits/stdc++.h> /* #in ...
- BZOJ_3063_[Usaco2013]Route Designing_DP
BZOJ_3063_[Usaco2013]Route Designing_DP Description After escaping from the farm, Bessie has decided ...