仅供参考

仅供参考

登录部分

代码:

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, Object> login(HttpServletRequest request)
    {
        Map<String, Object> resultMap = new LinkedHashMap<String, Object>();
        try
        {
            ShiroToken token = new ShiroToken("admin", "21232f297a57a5a743894a0e4a801fc3");
            token.setRememberMe(false);
            SecurityUtils.getSubject().login(token);
            ShiroToken token2 = (ShiroToken) SecurityUtils.getSubject().getPrincipal();

            logger.info(token2.getUsername() + "," + token2.getPswd());

            resultMap.put("status", 200);
            resultMap.put("message", "登录成功");

            /**
             * 获取登录之前的地址
             */
            SavedRequest savedRequest = WebUtils.getSavedRequest(request);
            String url = null;
            if (null != savedRequest)
            {
                url = savedRequest.getRequestUrl();
            }
            // 跳转地址
            resultMap.put("back_url", url);
        }
        catch (DisabledAccountException e)
        {
            resultMap.put("status", 500);
            resultMap.put("message", "帐号已经禁用。");
        }
        catch (Exception e)
        {
            resultMap.put("status", 500);
            resultMap.put("message", "帐号或密码错误");
        }
        return resultMap;
    }

注意几点:

1、登录密码记得加密,一般存在数据库中的密码是加密过的。

2、真正开始执行登录操作的是SecurityUtils.getSubject().login(token),这个方法会调用org.apache.shiro.realm.AuthorizingRealm的doGetAuthenticationInfo方法进行登录认证:

3、出错异常记得捕获

登录验证部分

代码如下:

   @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0)
    {
        ShiroToken token = (ShiroToken) arg0;
        String username = token.getUsername();

        // 根据username从数据库查找用户,得到密码
        // 假设找到的用户如下
        // User user = userService.findByUsername(username)
        User user = new User();
        user.setName(username);
        user.setPassword("21232f297a57a5a743894a0e4a801fc3"); // 数据库中的密码md5加密的

        if (null == user)
        {
            throw new AccountException("username is not exist");
        }
        else if (!user.getPassword().equals(token.getPswd()))
        {
            throw new AccountException("password is not right");
        }
        else
        {
            // 登陆成功
            logger.info("{} login success.", username);
        }
        return new SimpleAuthenticationInfo(arg0, user.getPassword(), username);
    }

注意几点:

1、一般会根据username从数据库中查找该用户,得到密码

2、进行密码校验,判断一致性

3、根据获取到的用户信息,也可以进行其它判断,如用户是否激活,是否被禁用等

授权部分

代码如下:

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0)
    {
        ShiroToken token = (ShiroToken) SecurityUtils.getSubject().getPrincipal();
        String username = token.getUsername();
        logger.info(username + "授权...");

        // 从数据库中查找该用户的角色和权限
        SimpleAuthorizationInfo sainfo = new SimpleAuthorizationInfo();

        Set<String> roles = new HashSet<String>();
        roles.add("admin");
        //roles.add("role1");
        Set<String> permissions = new HashSet<String>();
        permissions.add("add");
        permissions.add("delete");
        sainfo.setRoles(roles);
        sainfo.setStringPermissions(permissions);
        return sainfo;
    }

注意,一般是根据用户名从数据库中查找该用户的角色和权限,进行授权;当然其它途径也是可以的,如webservice接口,配置文件等获取用户权限。

权限拦截配置

如下:

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"></property>
        <property name="loginUrl" value="/security/view/login"></property>
        <property name="successUrl" value="/successUrl"></property>
        <!-- 用户访问未对其授权的资源时,所显示的连接 -->
        <property name="unauthorizedUrl" value="/unauthorizedUrl"></property>
        <property name="filters">
            <map>
                <entry key="anyRoles">
                    <bean class="cn.edu.hdu.ssd.core.shiro.AnyRolesAuthorizationFilter" />
                </entry>
            </map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                /security/**=anon
                /test/**=roles[role1]
                /users/**=anyRoles[admin,role1]
                /**=authc
            </value>
        </property>
    </bean>

根据用户的角色或权限来配置对应匹配的访问路径;

访问路径匹配任意角色

默认情况下,配置权限控制的时候,如

/test/**=roles[role1,admin]

结果是需要用户同时拥有role1和admin权限才能访问/test/**路径,这往往不符合我们的需求,

大部分情况,我们希望的是用户拥有role1和admin任一角色即可。

那么可以这样修改,编写一个过滤器:

public class AnyRolesAuthorizationFilter extends AuthorizationFilter
{

    // private Logger logger =  LoggerFactory.getLogger(ShiroCasAuthFilter.class);
    @Override
    protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue)
        throws Exception
    {
        Subject subject = getSubject(req, resp);
        String[] rolesArray = (String[]) mappedValue;

        if (rolesArray == null || rolesArray.length == 0)
        {
            return true;
        }
        for (int i = 0; i < rolesArray.length; i++)
        {
            if (subject.hasRole(rolesArray[i]))
            {
                return true;
            }
        }
        return false;
    }
}

配置shiroFilter bean的filters属性,如下,

        <property name="filters">
            <map>
                <entry key="anyRoles">
                    <bean class="cn.edu.hdu.ssd.core.shiro.AnyRolesAuthorizationFilter" />
                </entry>
            </map>
        </property>

最后,权限拦截配置可以这样配:

/test/**=anyRoles[admin,role1]

示例源码参考

https://github.com/peterchenhdu/spring-shiro-demo

测试

登录:http://localhost:8080/ssd/security/login ----->角色:admin,用户名:admin,密码:21232f297a57a5a743894a0e4a801fc3
权限测试:http://localhost:8080/ssd/users ----->访问成功
权限测试:http://localhost:8080/ssd/test/access ----->访问失败,无访问权限
换个角色登录,修改UserRealm.java里的角色为roler1,重新登录http://localhost:8080/ssd/security/login
权限测试:http://localhost:8080/ssd/users ----->访问成功
权限测试:http://localhost:8080/ssd/test/access ----->访问成功

springmvc集成shiro例子的更多相关文章

  1. springmvc集成shiro登录失败处理

    一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authenticat ...

  2. SpringMVC集成Shiro、读取数据库操作权限

    1.Maven添加Shiro所需的jar包 <dependency> <groupId>org.apache.shiro</groupId> <artifac ...

  3. springMVC集成 -- shiro(配置)

    备注:文中配置基本来自尚硅谷视频教程,也可自行参照shiro官方教程:http://shiro.apache.org/spring.html 1.首先通过maven导入shiro相关依赖jar包,修改 ...

  4. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

    项目结构:   1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  5. springmvc简单集成shiro

    前言: 有天和同事聊天, 谈起权限管理, 他说他有个同事用shiro用的很溜. 正好现在有个管理平台项目, 有权限控制的需求, 因此想借此机会研究一番. 本文主要简单讲解一下对shiro的一些认识, ...

  6. Shiro权限框架与SpringMVC集成

    1.Shiro整合SpringMVC 我们学习Shiro框架肯定是要应用到Web项目上的,所以我们需要整合Shiro和SpringMVC 整合步骤: 第一步:SpringMVC框架的配置 spring ...

  7. SpringMVC整合Shiro——(3)

    SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...

  8. webService学习之路(二):springMVC集成CXF快速发布webService

    继上一篇webService入门之后,http://www.cnblogs.com/xiaochangwei/p/4969448.html ,现在我将我周六在家研究的结果公布出来 本次集成是基于之前已 ...

  9. 十一、Spring Boot 集成Shiro和CAS

    1.Shiro 是什么?怎么用? 2.Cas 是什么?怎么用? 3.最好有spring基础 首先看一下下面这张图: 第一个流程是单纯使用Shiro的流程. 第二个流程是单纯使用Cas的流程. 第三个图 ...

随机推荐

  1. Interview website

    https://www.interviewcake.com http://www.leetcode.com

  2. gzip压缩及测试方法【转载】

    Nginx开启Gzip压缩大幅提高页面加载速度 http://www.veryhuo.com/a/view/51706.html 刚刚给博客加了一个500px相册插件,lightbox引入了很多js文 ...

  3. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  4. Python脚本控制的WebDriver 常用操作 &lt;十六&gt; 处理对话框

    下面将使用webdriver来处理一些页面跳出的对话框事件 测试用例场景 页面上弹出的对话框是自动化测试经常会遇到的一个问题.前端框架的对话框经常是div形式的,下面是一些常见的对话框操作事件: 打开 ...

  5. 学习C++ Primer 的个人理解(十二)

    动态内存与智能指针 在C++中, 动态内存用 new来分配空间并返回一个指向该对象的指针 用delete来销毁. 由于手动的对动态内存进行操作容易出现问题.所以新的标准库提供了两种智能指针. 智能指针 ...

  6. asp.net mvc将html编译

    从数据库查询出来的值,如果包含html标签并且通过MVC绑定页面的话,那么他会通过浏览器编译为字符串显示,所以我们有得在从新的转一次: HtmlString hh = new HtmlString(M ...

  7. NET Core环境并创建运行ASP.NET网站

    kungge 在Windows系统搭建.NET Core环境并创建运行ASP.NET网站 微软于6月27日在红帽DevNation峰会上 正式发布了.NET Core 1.0.ASP.NET 1.0和 ...

  8. SOFA 源码分析 — 调用方式

    前言 SOFARPC 提供了多种调用方式满足不同的场景. 例如,同步阻塞调用:异步 future 调用,Callback 回调调用,Oneway 调用. 每种调用模式都有对应的场景.类似于单进程中的调 ...

  9. Softmax函数详解与推导

    一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...

  10. php中print、echo、print_r、var_dump的区别

    echo,print,print_r,var_dump区别 print只能接收一个字符串:print有返回值1(可在表达式中使用) e.g print 'string 1' e.g if($exp & ...