shiro的一点记录(二)

这次主要写shiro的exception定制,RememberMe和SSL。

  1. Exception页面定制

    不知道这个属不属于shiro自身的范畴,反正这里用到了,就写上吧,主要是这些Exception都是shiro里面的,所以就在这里写上吧。根据资料显示,要定制错误页面,需要在springMVC配置文件里面配置相应的控制器异常处理。例如:

     <!--控制器异常处理 -->
        <bean id="exceptionHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
        </bean>
        <bean class="com.sohu.pps.realm.exception.MyExceptionHander"/>

    不知道咋回事,我注视掉这些配置文件后,自己写的错误异常控制器还是能用,不知道哪位大神可以解答下。

    核心的错误控制器如下,这里简单定制了两个常见的异常处理:

    @ControllerAdvice
    public class MyExceptionHander {
        /**
         * 没有权限 异常
         * 后续根据不同的需求定制即可
         */
        @ExceptionHandler({UnauthorizedException.class})
        @ResponseStatus(HttpStatus.UNAUTHORIZED)
        public ModelAndView processUnauthenticatedException(NativeWebRequest request, UnauthorizedException e) {
            ModelAndView mv = new ModelAndView();
            mv.addObject("exception", e);
            mv.setViewName("unauthorized");
            return mv;
        }
        /**
         * 没有验证通过异常
         * 后续根据不同的需求定制即可
         */
        @ExceptionHandler({UnknownAccountException.class})
        @ResponseStatus(HttpStatus.NOT_FOUND)
        public ModelAndView processUnknownAccountException(NativeWebRequest request, UnknownAccountException e) {
            String error;
            ModelAndView mv = new ModelAndView();
            mv.addObject("exception", e);
            mv.setViewName("unauthorized");
            return mv;
        }
  2. 然后是RememberMe:

    记住用户也有自己的管理器,需要在shiro的配置文件,大致的配置如下:

     <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
            <constructor-arg value="rememberMe"/>
            <property name="httpOnly" value="true"/>
            <property name="maxAge" value="604800"/><!-- 一个星期 -->
        </bean>
        <!-- rememberMe管理器 -->
        <bean id="rememberMeManager"
              class="org.apache.shiro.web.mgt.CookieRememberMeManager">
            <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
            <property name="cookie" ref="rememberMeCookie"/>
        </bean>

    然后在安全管理器里面加入RememberMe属性:

    <property name="rememberMeParam" value="rememberMe"/>

    控制器里面就可以使用了:

        @ResponseBody
        @RequestMapping(value="/login",method = RequestMethod.POST)
        public ModelAndView loginAction(@RequestParam("name")String name,@RequestParam("password")String password,
                                        @RequestParam(value = "rememberMe",required = false) boolean rememberMe )
        {
    
            ModelAndView mv=new ModelAndView();
            UsernamePasswordToken token=new UsernamePasswordToken(name,password);
            if(rememberMe)
            {
                token.setRememberMe(true);
            }
            else
            {
                token.setRememberMe(false);
            }
            SecurityUtils.getSubject().login(token);
            mv.setViewName("loginSuccess");
            return  mv;
        }
  3. SSL:

    SSL就是把http的访问编程https的访问,加了一个安全机制。这里需要数字证书等等东西,大致就是使用jdk为tomcat生成数字证书,然后修改tomcat的conf/server.xml配置文件,然后再在应用里面配置。

    生成数字证书部分可以自己在网上查一下,一大堆,我这里用的这个:http://www.cnblogs.com/sixiweb/p/3339698.html

    修改tomcat配置文件是把SSL的那个注释掉的打开就可以了:

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="D:\localhost.keystore" keystorePass="123456"/>

    然后在shiro里面加上一个ssl的拦截器就可以了:

    <bean id="sslFilter" class="org.apache.shiro.web.filter.authz.SslFilter">
            <property name="port" value="8443"/>
        </bean>

    这样就可以在shiroFilter里面使用ssl拦截器拦截相应的URL了。

时间: 2024-10-05 11:23:59

shiro的一点记录(二)的相关文章

shiro的一点记录

由于项目的需要,最近开始研究shiro这个框架.shiro是一个安全框架,主要是验证和授权管理,和它类似的有spring security框架,当然,spring security框架更加强大,但是shiro更加灵活(一般小的东西都比较灵活). 对于shiro,网上的资料可谓是少之又少.基本上算是被开涛大魔王的一个<跟我学shiro>垄断,当然这个教程是很全面,楼主也是跟着这个教程一点点学的(没办法,没有别的资料啊,很多看不懂的地方没地方找啊,shiro官网的英文看不懂啊卧槽).虽然过程很痛苦

shiro的一点记录(三)

shiro的无状态web集成.所谓无状态就是服务器端无状态,就是不保存会话.一般的会话机制的web应用,都是session机制来保存用户状态.无状态的web应用就是每次请求都带上相应的用户名进行登录. 具体的实践就是:客户端传入秘钥和一个消息作为输入,他们声称相应消息摘要,秘钥是只有客户端和服务端知道的.访问的时候服务端对消息摘要进行验证. 具体的实例如下: 首先我们创建subject的工厂必须是不保存session的: public class StatelessDefaultSubjectF

我的shiro之旅: 十二 shiro 踢出用户(同一用户只能一处登录)

我的shiro之旅: 十二 shiro 踢出用户(同一用户只能一处登录) 2014年09月05日 ⁄ 综合 ⁄ 共 4677字 ⁄ 字号 小 中 大 ⁄ 评论关闭 看了一下官网,没有找到关于如何控制同一用户只能一处登录的介绍,网上也没有找到相关的文章.可能有些人会记录用户的登录信息,然后达到踢出用户的效果.这里介绍一个更简单的方法. 如果我们跟shiro的源码,我们可以看到.当用户登录成功 后,shiro会把用户名放到session的attribute中,key为 DefaultSubjectC

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Spring Boot学习记录(二)--thymeleaf模板

Spring Boot学习记录(二)–thymeleaf模板 标签(空格分隔): spring-boot 自从来公司后都没用过jsp当界面渲染了,因为前后端分离不是很好,反而模板引擎用的比较多,thymeleaf最大的优势后缀为html,就是只需要浏览器就可以展现页面了,还有就是thymeleaf可以很好的和spring集成.下面开始学习. 1.引入依赖 maven中直接引入 <dependency> <groupId>org.springframework.boot</gr

lodop打印控件一点记录

今天初步接触了下打印控件 LODOP实现了自动分页,高度宽度都可以自己设定来分页. 页码,使用LODOP.SET_PRINT_STYLE("ItemType", 2); LODOP.ADD_PRINT_TEXT(0,0,"95%",30,"总页号:第#页/共&页"); 让每个分页都显示页码/总页数,#当前页,$总页数. 每页页眉页脚.使用LODOP.SET_PRINT_STYLE("ItemType", 1); 来让其

前端常用功能记录(二)—datatables表格(转)

前端常用功能记录(二)—datatables表格 并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是雪中送炭,当然对于专业的前端开发者来说它更是锦上添花!DataTables提供了针对表格的排序.浏览器分页.服务器分页.筛选.格式化.统计等强大功能. 工作中对程序员的学习模式才深有体会,不是从入门到精通,而是从会用到了解.对于我来说,基本都是拿到一个知识先做个东西出来,再来细细品味个中的细节,然后

对Integer类中的私有IntegerCache缓存类的一点记录

对Integer类中的私有IntegerCache缓存类的一点记录 // Integer类有内部缓存,存贮着-128 到 127. // 所以,每个使用这些数字的变量都指向同一个缓存数据 // 因此可以直接使用 == 来比较是否相等 Integer a = 88; Integer b = 88; System.out.println(a == b); // true // 下面这个不在Integer缓存类里的数字,在每次赋值的时候都会新建一个对象存放 // 所以,它们不能使用 == 来判断是否相

Apache Shiro 使用手册(二)Shiro 认证

认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的"实体/凭证"组合便是"用户名/密码"组合. 一.Shiro认证过程 1.收集实体/凭据信息 Java代码   //Example using most common scenario of username/password pair: UsernamePasswordToken token = new Userna