shiro权限认证Realm的四大用法

一、SimpleAccountRealm

public class AuthenticationTest {

SimpleAccountRealm sar=new SimpleAccountRealm();

@Before

public void addUser() {

sar.addAccount("mark", "123456","admin","user");

}

@Test

public void testAuthentication() {

//1.构建seruritymanager环境

DefaultSecurityManager dsm=new DefaultSecurityManager();

dsm.setRealm(sar);

//2.主题提交认证请求

SecurityUtils.setSecurityManager(dsm);

Subject subject=SecurityUtils.getSubject();

UsernamePasswordToken token=new UsernamePasswordToken("mark","123456");

subject.login(token);

System.out.println("isAuthenticated:"+subject.isAuthenticated());

subject.checkRoles("admin","user");

}

二.IniRealm

public class IniRealmTest {

@Test

public void testIniRealm() {

IniRealm realm=new IniRealm("classpath:user.ini");

DefaultSecurityManager defaultSerurityManager=new DefaultSecurityManager();

defaultSerurityManager.setRealm(realm);

SecurityUtils.setSecurityManager(defaultSerurityManager);

Subject subject = SecurityUtils.getSubject();

UsernamePasswordToken upt=new UsernamePasswordToken("mark","123456");

subject.login(upt);

System.out.println("isAuthentication:"+subject.isAuthenticated());

subject.checkRole("admin");

subject.checkPermission("user:update");

}

}

三、JDBCRealm

public class JDBCRealmTest {

DruidDataSource dataSource=new DruidDataSource();

{

dataSource.setUrl("jdbc:mysql://localhost:3306/xxxx");

dataSource.setUsername("root");

dataSource.setPassword("root");

}

@Test

public void testJDBCRealm() {

JdbcRealm realm=new JdbcRealm();

realm.setDataSource(dataSource);

realm.setPermissionsLookupEnabled(true);

//如果不用自己的sql,数据库表名必须与shiro默认的查询语句中的一致,一般情况下都是使用自定义的sql,如下:

String sql="select password from test_user where user_name=?";

realm.setAuthenticationQuery(sql);

String roleSql="select role_name from test_user_roles where user_name=?";

realm.setUserRolesQuery(roleSql);

String permissionSql="select permission from test_roles_permissions where role_name=?";

realm.setPermissionsQuery(permissionSql);

DefaultSecurityManager dsm=new DefaultSecurityManager();

dsm.setRealm(realm);

SecurityUtils.setSecurityManager(dsm);

Subject subject = SecurityUtils.getSubject();

UsernamePasswordToken token=new UsernamePasswordToken("xm","123");

subject.login(token);

System.out.println("isAuthencation:"+subject.isAuthenticated());

subject.checkRole("admin");

subject.checkRoles("admin","user");

subject.checkPermission("user:delete");

}

}

四、自定义Realm

public class customRealmTest {

@Test

public void testCustomRealm() {

CustomRealm realm=new CustomRealm();

DefaultSecurityManager sdm=new DefaultSecurityManager();

sdm.setRealm(realm);

HashedCredentialsMatcher hcm=new HashedCredentialsMatcher();

hcm.setHashAlgorithmName("md5");

hcm.setHashIterations(1);

realm.setCredentialsMatcher(hcm);

SecurityUtils.setSecurityManager(sdm);

Subject subject = SecurityUtils.getSubject();

UsernamePasswordToken token=new UsernamePasswordToken("mark","123456");

subject.login(token);

System.out.println("isAuthencation:"+subject.isAuthenticated());

subject.checkRole("admin");

subject.checkRoles("admin","user");

subject.checkPermission("user:delete");

}

}

public class CustomRealm extends AuthorizingRealm {

Map<String, String> userMap=new HashMap<>();

{

//模拟数据库中查询出的数据

userMap.put("mark", "73bea81c6c06bacab41a995495239545");

super.setName("customReal");

}

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

String userName = (String) principals.getPrimaryPrincipal();

//通过用户名获取数据库或缓存中的角色

Set<String> roles=getRolesByUserName(userName);

Set<String> premissions=getpremissionsByUserName(userName);

SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();

info.setStringPermissions(premissions);

info.setRoles(roles);

return info;

}

private Set<String> getpremissionsByUserName(String userName) {

Set<String> permission=new HashSet<>();

permission.add("user:delete");

return permission;

}

private Set<String> getRolesByUserName(String userName) {

Set<String> roles=new HashSet<>();

roles.add("admin");

roles.add("user");

return roles;

}

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

//1.通过主体传过来的信息获取用户名

String userName=(String) token.getPrincipal();

//2.通过用户名去数据库获取凭证

String password=getPassowrdByUserName(userName);

if(password==null) {

return null;

}

SimpleAuthenticationInfo info=new SimpleAuthenticationInfo("mark",password,"customReal");

//加盐--如果数据库中密码是加盐密文,此处应该设置盐的值

info.setCredentialsSalt(ByteSource.Util.bytes("mark"));

return info;

}

private String getPassowrdByUserName(String userName) {

//实际中去查数据库   这个方便演示

return userMap.get(userName);

}

public static void main(String[] args) {

System.out.println((int)(1+Math.random()*10));

//        Md5Hash hsh=new Md5Hash("123456");  //md5加密

Md5Hash hsh=new Md5Hash("123456","mark");  //MD5加密并加盐    更安全

System.out.println(hsh);

}

}

原文地址:https://www.cnblogs.com/wlv1314/p/12115946.html

时间: 2024-10-04 21:25:13

shiro权限认证Realm的四大用法的相关文章

Shiro权限认证

   一.权限认证核心要素 权限认证顾名思义,就是在应用系统中,控制谁能访问哪些资源.核心要素有仨:权限.角色.用户 权限:即操作资源的权利,如访问某个url,对某个模块数据进行增删改查 角色:权限的集合,一种角色可以包含多种权限.例如操作员角色可查看系统账单.进行结账操作多种权限. 用户:也就是身份认证中提到的subject一角. 二.授权 shiro授权的方式通常有三种: 1.编程式授权:在代码中进行授权操作,可基于角色和权限两种方式. 2.注解式授权:使用注解对方法或类进行授权,标注该类可

shiro 权限认证的原理,个人的理解

1.对有没有访问权限的理解.  我们这里要对系统中的 角色组.角色.用户.功能 之间的关系要理清楚,http://blog.csdn.net/baicp3/article/details/45028013方便下面用户是否具有某一url的访问. 我们看shiro的配置文件,所以的请求都是需要用户登录的 因而用户 在登录成功时候,shiro已经把该用户是否有访问某一url的权限已经判断好了. 看下面简单的代码 @Override protected AuthorizationInfo doGetAu

springMVC集成shiro权限认证框架,登录之后退出登录出现登录不上的问题

有两种解决方式: 1.在web.xml文件配置一段欢迎页面: <welcome-file-list> <welcome-file>/index.do</welcome-file> </welcome-file-list> 2.在自定义表单过滤器MyFormAuthenticationFilter里,添加清除shiro 在sesion存储的上一次访问地址 shiroSavedReques 1 package cn.zj.logistic.shiro; 2 3

Spring Boot Shiro 权限管理 【转】

http://blog.csdn.net/catoop/article/details/50520958 主要用于备忘 本来是打算接着写关于数据库方面,集成MyBatis的,刚好赶上朋友问到Shiro权限管理,就先总结下发出来了. 使用Shiro之前用在spring MVC中,是通过XML文件进行配置. 既然现在在写Spring Boot的帖子,就将Shiro应用到Spring Boot中,我本地已经完成了SpringBoot使用Shiro的实例,将配置方法共享一下. 先简单介绍一下Shiro,

十、 Spring Boot Shiro 权限管理

使用Shiro之前用在spring MVC中,是通过XML文件进行配置. 将Shiro应用到Spring Boot中,本地已经完成了SpringBoot使用Shiro的实例,将配置方法共享一下. 先简单介绍一下Shiro,对于没有用过Shiro的朋友,也算是做个简介吧. Shiro是Apache下的一个开源项目,我们称之为Apache Shiro.它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理,与 Spring Security 一样都是做一个权限的安全框架,但是与S

Shiro身份认证、盐加密

目的: Shiro认证 盐加密工具类 Shiro认证 1.导入pom依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.s

Shiro权限控制框架入门1:Shiro的认证流程以及基本概念介绍

前言:我在最开始学习Shiro这个框架时,在网上搜索到的一个介绍比较全面的教程是:<跟我学Shiro>系列教程.但是在我看了他写的前几篇文章后,我发现虽然他在这个系列教程中把shiro的一些特性介绍地非常全面详细,但是整个教程的叙述方式还是有很大缺陷的.文章与文章之间并没有很好地串联起来,每篇文章介绍的东西都过于分散了,如果是对shiro完全不了解的新手来看的话完全是一场噩梦.就像一个网友评价的这样: 看了看这个教程,看完之后都想放弃shiro了,完全看不懂,后来百度了很多别的资料才理解了sh

shiro中基于注解实现的权限认证过程

授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模型,通常把用户信息单独用一个实体表示,用户权限信息用两个实体表示. 用户信息用 LoginAccount 表示,最简单的用户信息可能只包含用户名 loginName 及密码 password 两个属性.实际应用中可能会包含用户是否被禁用,用户信息是否过期等信息. 用户权限信息用 Role 与 Per

【Shiro】Apache Shiro架构之权限认证(Authorization)

上一篇博文总结了一下Shiro中的身份认证,本文主要来总结一下Shiro中的权限认证(Authorization)功能,即授权.如下: 本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authorization.html. 本文遵循以下流程:先介绍Shiro中的权限认证,再通过一个简单的实例来具体说明一下API的使用(基于maven). 1. 权限认证的核心要素 权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源.在权限认证中,最核心的三个要素