shiro自定义Realm授权

shiro授权方式:
shiro提供三种授权方式,分别是
1、编程式、

Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) { 
//有权限 
} else { 
//无权限 
}

2、注解式:通过在方法上添加注解来控制访

@RequiresRoles("admin")
 public void hello() { 
 //有权限 
 }

3、标签

<shiro:hasRole name="admin"> 
<!— 有权限相关操作—>
 </shiro:hasRole>

damo
实现现先认证再授权

1、新建一个Java项目
2、导包
在这里插入图片描述
3、项目结构
在这里插入图片描述
4、编写自定义Reaml类

package com.text.shiro;

import java.util.ArrayList;
import java.util.List;

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;

/*
 * 自定义Realm实现,该Realm类提供了两个方法
 * doGetAuthorizationInfo 获取认证信息
 * doGetAuthenticationInfo 获取权限信息 
 */
public class UserRealm extends AuthorizingRealm {
	
	@Override
		public String getName() {
			return "userRealm";
		}
	
	//完成身份认证(从数据库中去数据)并且放回认证信息
	//如果身份认证失败,返回null
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) 
			throws AuthenticationException {
		String principal = (String)token.getPrincipal();
		System.out.print("username=======" +principal);
		//这里要根据principal 到数据库中查询password
		//假定查询到是password为 1111
		String pwd = "1111";
		SimpleAuthenticationInfo Info = new SimpleAuthenticationInfo(principal, pwd, getName());
		return Info;
	}

	//获取授权信息
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		//获取身份信息
		//获取身份信息
		String username =
		(String)principals.getPrimaryPrincipal();
		//根据身份信息获取权限数据
		//模拟
		List<String> permissions = new ArrayList<String>();
		permissions.add("user:save");
		permissions.add("user:delete");
		//将权限信息保存到AuthorizationInfo 中
		SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
		for(String permission:permissions){
		simpleAuthorizationInfo.addStringPermission(permission);
		}
		return simpleAuthorizationInfo;
	}
}

5、编写ini、log4j.properties

[main]
userRealm=com.text.shiro.UserRealm
securityManager.realm=$userRealm
[users]
zhangsan=1111
wangwu=1111
log4j.rootCategory=INFO, CONSOLE ,LOGFILE

log4j.logger.com.bjsxt.mapper=DEBUG
log4j.logger.com.text.shiro=INFO
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %d{YYYY-MM-dd hh:mm:ss}  %m %n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=E:/my.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%m %n

6、编写测试类

package com.txt.shiro;

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 AuthenticationDemo {

	public static void main(String[] args) {
		//1创建SecurityManager工厂,加载配置文件
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
		//2 通过SecurityManager工厂获取SecurityManager实例
		SecurityManager securityManager = factory.getInstance();
		//3将SecurityManager设置到运行环境中
		SecurityUtils.setSecurityManager(securityManager);
		//通过SecurityUtils获取subject
		Subject subject = SecurityUtils.getSubject();
		System.out.print(subject+"\n");
		//这里是登录时用户填写的用户名和密码
		//shiro里存放的是系统中用户的信息,也可以存放到数据库中
		UsernamePasswordToken token = new UsernamePasswordToken("wangwu","1111");
		//进行登录认证
		try {
			subject.login(token);
			//subject.isAuthenticated()判断是否登录成功,若是不成功会报错
			if(subject.isAuthenticated()) {
				System.out.print("登录成功\n");
			}
		} catch (UnknownAccountException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.print("用户或者密码不正确\n");
		} catch (IncorrectCredentialsException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.print("用户或者密码不正确\n");
		}
		System.out.println(subject.isPermittedAll("user:delete"));
	}
}

7、运行结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值