shiro学习笔记_0600_自定义realm实现授权

博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权。

1,仅仅通过配置文件来指定权限不够灵活且不方便。在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 保存到了数据库中。所以需要从数据库中去获取相关的数据信息。可以使用 shiro 提供的JdbcRealm来实现,,也可以自定义realm来实现。使用jdbcRealm往往也不够灵活。所以在实际应用中大多数情况都是自定义Realm来实现。

2,自定义Realm 需要继承 AuthorizingRealm。

例子程序:

新建maven项目:

maven依赖:

<dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.3.2</version>
    </dependency> 

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>  

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency> 

    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.31</version>
    </dependency>

shiro.ini配置:

[main]
userRealm=com.lhy.realm.UserRealm
securityManager.realm=$userRealm

log4j.properties:

log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n

userRealm:

这里没有使用数据库,配置文件shiro.ini里不用配置[users]信息,因为这里在userRealm里的认证方法里的密码是模拟的,实际肯定会去数据库取。

package com.lhy.realm;

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类提供了两个方法:
 * 1,doGetAuthenticationInfo:获取认证信息
 * 2,doGetAuthorizationInfo:获取权限信息
 * @author Administrator
 *
 */
public class UserRealm extends AuthorizingRealm{

    //realm接口的方法
    @Override
    public String getName() {
        return "userRealm";
    }

    //完成身份认证并返回认证信息
    //如果身份认证失败,返回null
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {
        //获取用户输入的用户名
        String username = (String)token.getPrincipal();//获取身份信息
        System.out.println("username----"+username);
        //实际开发是调用service根据用户名去数据库查对应的密码
        //假设获取的密码是1111
        String password = "1111";
        //Object principal, Object credentials, String realmName
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,password,getName());
        return info;
    } 

    //授权的信息
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //主的 身份信息
        String username = principals.getPrimaryPrincipal().toString();
        System.out.println("==========授权===========");
        System.out.println("username ---"+username);
        //根据用户名到数据库查询当前用户对应的权限信息    ---这里模拟
        List<String> permissions = new ArrayList<String>();
        permissions.add("user:add");
        permissions.add("user:delete");
        permissions.add("user:update");
        permissions.add("user:find");
        /*
         * 实现了AuthorizationInfo接口的pojo,内部存的是权限和角色
         */
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //给当前用户分配权限
        info.addStringPermissions(permissions);
        return info;
    }
}

测试程序:

package com.lhy.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
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 userRealmDemo { 

    public static void main(String[] args) {
        //1,创建SecurityManager工厂  读取shiro配置文件
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //2  通过securityManager工厂获取SecurityManager实例
        SecurityManager securityManager = factory.getInstance();
        //3 将SecurityManager 对象设置到运行环境
        SecurityUtils.setSecurityManager(securityManager);
        //4 通过SecurityUtils获取主体subject
        Subject subject = SecurityUtils.getSubject();
        try {
            //5.假设登录名是zhangsan  密码是1111
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","1111");
            //6,登录,进行用户身验证
            subject.login(token);
            //通过subject判断用户是否通过验证
            if(subject.isAuthenticated()){
                System.out.println("用户登录成功!");
            }
        } catch (UnknownAccountException e) {
            System.out.println("用户名或密码错误!");
            e.printStackTrace();
        }catch (IncorrectCredentialsException e) {
            System.out.println("用户名或密码错误!");
            e.printStackTrace();
        }

        System.out.println(subject.isPermittedAll("user:add","user:delete","user:update"));
        //7 退出
        subject.logout();   

    }
}
时间: 2024-12-14 11:28:59

shiro学习笔记_0600_自定义realm实现授权的相关文章

Apache Shiro学习笔记(三)用户授权自定义Permission

鲁春利的工作笔记,好记性不如烂笔头 Shiro配置文件(shiro-customize-permission.ini) [main] myRealmA=com.invicme.apps.shiro.permission.MyRealmOne myPermissionResolver=com.invicme.apps.shiro.permission.MyPermissionResolver securityManager.authorizer.permissionResolver = $myPe

Apache Shiro学习笔记(三)用户授权

鲁春利的工作笔记,好记性不如烂笔头 Shiro默认提供的Realm 认证(Authentication)用来证明用户身份是合法的:而授权(Authorize)用来控制合法用户能够做什么(能访问哪些资源). 实际系统应用中一般继承AuthorizingRealm(授权)即可:其继承了AuthenticatingRealm(即身份验证),而且也间接继承了CachingRealm(带有缓存实现). 在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permissio

Shiro学习笔记(3)——授权(Authorization)

什么是授权 授权三要素 Shiro的三种授权方式 1 编码方式授权 2 基于注解的授权 3 JSP标签授权 1.什么是授权 授权,就是访问控制,控制某个用户在应用程序中是否有权限做某件事 2.授权三要素 权限 请看Shiro学习笔记(1)--shiro入门中权限部分内容 角色 通常代表一组行为或职责.这些行为演化为你在一个软件应用中能或者不能做的事情.角色通常是分配给用户帐户的,因此,通过分配,用户能够"做"的事情可以归属于各种角色 隐式角色:一个角色代表着一系列的操作,当需要对某一操

Shiro学习笔记(2)——身份验证之Realm

环境准备 什么是Realm 为什么要用Realm 自定义Realm 多个Realm 配置Authenticator和AuthenticationStrategy 自定义AuthenticationStrategy验证策略 多个Realm验证顺序 环境准备 创建java工程 需要的jar包 大家也可以使用maven,参考官网 什么是Realm 在我所看的学习资料中,关于Realm的定义,写了整整一长串,但是对于初学者来说,看定义实在是太头疼了. 对于什么是Realm,我使用过之后,个人总结一下:s

Shiro学习笔记(5)——web集成

Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在普通web项目和spring项目中的配置是不一样的.关于spring-shiro集成,能够參考Shiro学习笔记(3)--授权(Authorization) 中的JSP标签授权部分演示样例代码 本次介绍普通的web项目,不使用不论什么框架. shiro配置文件(shiro.ini) 创建web项目.

Shiro学习笔记(4)——ini 配置

ini 配置文件 在前面三个笔记中也有使用到ini配置文件,但是没有进行详细的解析,本次来介绍一下如何配置. ini配置文件其实和properties配置文件一样的使用方法,都是键值对的形式(key=value),#号代表注释 ini配置中主要配置有四大类:main,users,roles,urls [main] #提供了对根对象 securityManager 及其依赖的配置 securityManager=org.apache.shiro.mgt.DefaultSecurityManager

Apache Shiro学习笔记(六)FilterChain

鲁春利的工作笔记,好记性不如烂笔头 Apache Shiro学习笔记(七)IniWebEnvironment

[转载]SharePoint 2013搜索学习笔记之自定义结果源

搜索中心新建好之后在搜索结果页上会默认有所有内容,人员,对话,视频这四个结果分类,每个分类会返回指定范围的搜索结果,这里我再添加了部门日志结果分类,搜索这个分类只会返回部门日志内容类型的搜索结果,要实现这个效果,步骤如下: 第一步,进入管理中心,进入管理应用程序,点击Search Service 应用程序,进入搜索管理页,再点击结果源如图: 第二步,新建结果源,填写名称,协议填写本地sharepoint,凭据信息选择默认, 第三步,点击启动查询生成器,生成查询语句,最后点保存,接着继续点新建内容

Sharepoint2013搜索学习笔记之自定义结果精简分类(八)

搜索结果页左边的结果精简分类是可以根据搜索结果自定义的,在搜索的部门日志结果集页面上我搜索测试关键字,左边分类导航在默认分类的基础上增加了一个日志类型的分类,如下图: 要实现这个效果,导航到之前定义的depresult.aspx页面上,点编辑页面 Sharepoint2013搜索学习笔记之自定义结果精简分类(八)