dsfsefesfsffsfsfsfsfesfsfsfsfsfsfspackage realm;

 

import java.util.ArrayList;

import java.util.List;

 

import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

import org.apache.commons.lang3.builder.ToStringStyle;

import org.apache.shiro.SecurityUtils;

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.authc.UsernamePasswordToken;

import org.apache.shiro.authz.AuthorizationException;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.authz.SimpleAuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

import org.apache.shiro.session.Session;

import org.apache.shiro.subject.PrincipalCollection;

import org.apache.shiro.subject.Subject;

import org.springframework.beans.factory.annotation.Autowired;

 

import utils.StrUtils;

 

import com.jxzg.mvc.web.entitys.user.Role;

import com.jxzg.mvc.web.entitys.user.RoleRight;

import com.jxzg.mvc.web.entitys.user.User;

import com.jxzg.mvc.web.service.user.IUserManager;

 

public class MyRealm extends AuthorizingRealm {

 

    @Autowired

    private IUserManager userManager;

 

    /**

     * 为当前登录的Subject授予角色和权限

     * @see 经测试:本例中该方法的调用时机为用户登录后,被调用

     */

    @Override

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        // 获取当前登录的用户名,等价于(String)principals.fromRealm(this.getName()).iterator().next()

        String currentUsername = (String) super.getAvailablePrincipal(principals);

        List<String> roleList = new ArrayList<String>();

        List<String> permissionList = new ArrayList<String>();

        // 从数据库中获取当前登录用户的详细信息

        User user = userManager.getByUsername(currentUsername);

        if (null != user) {

            // 实体类User中包含有用户角色的实体类信息

            if (null != user.getRole()) {

                // 获取当前登录用户的角色

                Role role = user.getRole();

                roleList.add(role.getName());

                //如果是超级管理员直接赋予所有权限

                if(role.getName().equals("admin")){

                    permissionList.add("user");

                    permissionList.add("school");

                }

                

                else{

                    // 实体类Role中包含有角色权限的实体类信息

                    if (null != role.getRights() && role.getRights().size() > 0) {

                        // 获取权限

                        for (RoleRight pmss : role.getRights()) {

                            if(pmss.isFlag()){

                                if (!StrUtils.isNullOrEmpty(pmss.getRight())) {

                                    permissionList.add(pmss.getRight().getName());

                                }

                            }

                        }

                    }

                }

            }

        } else {

            throw new AuthorizationException();

        }

        // 为当前用户设置角色和权限

        SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();

        simpleAuthorInfo.addRoles(roleList);

        simpleAuthorInfo.addStringPermissions(permissionList);

        return simpleAuthorInfo;

    }

 

    /**

     * 验证当前登录的Subject

     * @see 经测试:本例中该方法的调用时机为LoginController.login()方法中执行Subject.login()时

     */

    @Override

    protected AuthenticationInfo doGetAuthenticationInfo(

            AuthenticationToken authcToken) throws AuthenticationException {

        // 获取基于用户名和密码的令牌

        // 实际上这个authcToken是从LoginController里面currentUser.login(token)传过来的

        // 两个token的引用都是一样的

        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

        System.out.println("验证当前Subject时获取到token为"

                + ReflectionToStringBuilder.toString(token,

                        ToStringStyle.MULTI_LINE_STYLE));

        User user = userManager.getByUsername(token.getUsername());

        if (null != user) {

            AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(

                    user.getUserName(), user.getPass(), user.getNickName());

            this.setSession("currentUser", user);

            return authcInfo;

        } else {

            return null;

        }

    }

 

    /**

     * 将一些数据放到ShiroSession中,以便于其它地方使用

     * @see 比如Controller,使用时直接用HttpSession.getAttribute(key)就可以取到

     */

    private void setSession(Object key, Object value) {

        Subject currentUser = SecurityUtils.getSubject();

        if (null != currentUser) {

            Session session = currentUser.getSession();

            if (null != session) {

                session.setAttribute(key, value);

            }

        }

    }

 

}

hahahahah的更多相关文章

  1. appium 滑动

    前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html   知乎Android客户端登陆:htt ...

  2. appium实现截图和清空EditText

    前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html   知乎Android客户端登陆:htt ...

  3. python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)

    1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...

  4. python初学day01

    1.执行Python脚本时打印的字符有颜色 1. print "\033[32;1mhello\033[0m" #打印绿色 2. print "\033[31;1mhel ...

  5. spring aop advice

    1.前置通知(BeforeAdvice): import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAd ...

  6. python基础篇-day1

    python基础篇 python是由C语言写的: pass 占位符: del,python中全局的功能,删除内存中的数据: 变量赋值的方法: user,pass = 'freddy','freddy1 ...

  7. Flume笔记--示例(使用配置文件)

    例子参考资料:http://www.aboutyun.com/thread-8917-1-1.html 自定义sink实现和属性注入:http://www.coderli.com/flume-ng-s ...

  8. 【Python&Sort】QuickSort

    Python版的快排,使用递归. 1.设置递归终止条件,当元素个数<1时 2.从列表中pop出一个元素pv 3.列表中的剩余值与pv进行对比,大的放入smaller列表,小的放入larger列表 ...

  9. 点击盒子选中里面的单选框,并给盒子添加相应样式,美化单选框、复选框样式css用法,响应式滴

    pc效果图: 移动端效果图: 代码直接上: <!DOCTYPE html> <html> <head> <meta http-equiv="Cont ...

随机推荐

  1. Delphi编写的Android程序获取Root权限实现(2015.4.15更新,支持Android 4.4)

    借助谷歌,并经过本大侠施展坑.蒙.拐.骗.偷五大绝技,终于成功实现在Delphi下获取Root权限并将其扩展为一个完整功能更加完整的TQAndroidShell记录,在华为荣耀2(Android 4. ...

  2. C#内存操作

    原文:[转]C#内存操作 最近闲来无事发现周围的朋友都在玩<植物大战僵尸>的游戏!于是动了制作这游戏工具的念头!虽然在网上同类工具很多 但是用C#写的我几乎看不到!所以我想用C#写一个!  ...

  3. SpringMVC中使用zTree

    1  前端页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...

  4. Spring、基本类型属性和集合类型属性的注入

    Spring 还可以对基本属性和集合类型属性进行注入: public interface PersonIService { public String getBaseProperty(); publi ...

  5. 网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型_1计算分数精确值

    1 计算分数精确值(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商, ...

  6. Android-Tab单选控件

    今天看到项目中有一个控件写得很美丽,据说是github上开源的控件,地址没找到,例如以下图所看到的,很常见的效果,几个tab页面来回切换: 转载请标明出处:http://blog.csdn.net/g ...

  7. 如何用C#把Doc文档转换成rtf格式

    先在项目引用里添加上对Microsoft Word 9.0 object library的引用 using System; namespace DocConvert { class DoctoRtf ...

  8. dog-fooding-our-api-authentication

    Dog-fooding our API - Authentication http://blog.mirajavora.com/authenticate-web-api-using-access-to ...

  9. mybatisnet轻量级ORM框架

    https://code.google.com/p/mybatisnet/source/checkout http://blog.csdn.net/arvinstudy/article/details ...

  10. C#.NET学习笔记7--11---算术运算符,变量赋值,变量的交换,布尔表达式1,布尔表达式2

    C#.NET学习笔记7---算术运算符 2013/9/6 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com 1.Consol ...