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、运行结果