Loading...
My Blog 我的工作和学习笔记

Apache Shiro配置shiroFilter过滤url鉴权引起错误问题的处理

Apache框架笔记 2015/12/27 Spring MVC , Apache Shiro

Apache Shiro配置shiroFilter拦截url登录于鉴权引起的错误问题处理

<!-- Shiro Filter -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/login" />
        <property name="successUrl" value="/system/main" />
        <property name="unauthorizedUrl" value="/login" />
        <property name="filterChainDefinitions">
            <value>
            /console/toSignin = anon
            /console/signin = anon
            /console/validateCode = anon
            
            /console/** = authc
            
            /blog/article/input** = authc
            /blog/tag** = authc
            /blog/channel** = authc
            
            /todo/input** = authc
            /todo/edit** = authc
            /todoitem/input** = authc
            
            </value>
        </property>
</bean>

在上述配置中加authc的url,如果用户没登陆,便会跳转到loginUrl进行登陆。

如果通过在方法上加注解@RequiresAuthentication去实现url的鉴权,则存在如下问题:

1. 如果用户没登陆系统,系统给出如下异常:

org.apache.shiro.authz.UnauthenticatedException: The current Subject is not authenticated.  Access denied.

而不会跳转到loginUrl登陆。

2.如果是用户已经登陆,但是没某个url操作的权限,则需要在方法上加注解@RequiresPermissions(value="user:create")让其具有权限才能执行,否则抛出如下异常:

org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [user:create]

而不会跳转到loginUrl登陆。


为了对这些异常进行拦截处理,可以通过如下方法

1、编写Spring MVC拦截器进行拦截

2、配置Spring MVC全局错误拦截


这里进行Spring MVC全局错误拦截:

<!-- 全局错误拦截配置 -->

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
            <!-- 登录错误 -->
            <prop key="org.apache.shiro.authz.UnauthenticatedException">redirect:/login</prop>
            <!-- 授权错误 -->
                <prop key="org.apache.shiro.authz.UnauthorizedException">/base/error/403</prop>
            </props>
        </property>
        <!-- 默认错误 -->
        <property name="defaultErrorView" value="/base/error/500"/>
</bean>


参考文档

http://wenku.baidu.com/view/97f5868b76eeaeaad1f33065.html


Apache Log2j 2 学习笔记

Apache框架笔记 2015/09/29 日志框架

log4j 1.X用了好几年了,花了点时间研究学习了一下log4j 2.X,简介记录一下学习笔记。

#使用maven构建项目,编辑pom.xml文件,首先引入dependency

<dependency>

   <groupId>org.apache.logging.log4j</groupId>

   <artifactId>log4j-api</artifactId>

   <version>2.4</version>

 </dependency>

 <dependency>

   <groupId>org.apache.logging.log4j</groupId>

   <artifactId>log4j-core</artifactId>

   <version>2.4</version>

 </dependency>

 <dependency>

   <groupId>org.apache.logging.log4j</groupId>

   <artifactId>log4j-slf4j-impl</artifactId>

   <version>2.4</version>

 </dependency>

 <dependency>

   <groupId>org.apache.logging.log4j</groupId>

   <artifactId>log4j-nosql</artifactId>

   <version>2.4</version>

 </dependency>

      <dependency>

        <groupId>org.mongodb</groupId>

        <artifactId>mongo-java-driver</artifactId>

        <version>2.12.3</version>

      </dependency>


#以下是测试好的配置文件,添加相关的注释

文件名称为:log4j2.xml,配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!-- status表示log4j事件输出控制台级别,分别有"trace", "debug", "info", "warn", "error","fatal" -->

<!-- monitorInterval表示log4j会自动监听配置文件的变动,最小监听时间为5秒 -->

<Configuration status="WARN" monitorInterval="5">


   <!-- 通用属性配置 -->

  <Properties>

    <Property name="appname">imethan</Property>

  </Properties>

  

  <!-- 默认过滤等级 -->

  <ThresholdFilter level="trace"/>

  

  <Appenders>

  <!-- 控制台输出 -->

    <Console name="Console" target="SYSTEM_OUT">

      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>

    </Console>

    

    <!-- 单个文件记录 -->

    <File name="File" fileName="${appname}.log" bufferedIO="true" advertiseURI="target/output.log" advertise="false">

    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>

    </File>

    <Appender type="File" name="File" fileName="${appname}.log">

      <Layout type="PatternLayout">

        <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>

      </Layout>

    </Appender>

    

    <!-- 每日文件记录 -->

<RollingFile name="RollingFile" fileName="logs/${appname}.log" filePattern="logs/${appname}-%d{MM-dd-yyyy}.log.gz">

      <BurstFilter level="debug" rate="16" maxBurst="100"/>

      <PatternLayout>

        <pattern>%d %p %c{1.} [%t] %m%n</pattern>

      </PatternLayout>

      <TimeBasedTriggeringPolicy />

    </RollingFile>

    

    <!-- NoSql数据库记录 -->

    <NoSql name="databaseAppender" ignoreExceptions="false">

      <MongoDb databaseName="database" collectionName="applicationLog" server="127.0.0.1"

               username="" password="" />

    </NoSql>

        

  </Appenders>

  

  <Loggers>

  <!-- 全局日志记录 -->

    <Root level="debug">

      <AppenderRef ref="Console"/>

      <AppenderRef ref="File"/>

      <AppenderRef ref="RollingFile"/>

      <AppenderRef ref="databaseAppender"/>

    </Root>

    

  <!-- 定义特定的程序的日志记录,additivity设置为flase,阻止Root再次打印 -->

  <Logger name="cn.log4j.Bar" level="debug" additivity="false">

      <AppenderRef ref="Console"/>

      <AppenderRef ref="File"/>

      <!-- 过滤输出特定的日志 -->

      <Filters>

        <MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="NEUTRAL"/>

        <MarkerFilter marker="EXCEPTION" onMatch="ACCEPT" onMismatch="DENY"/>

      </Filters>

    </Logger>

  </Loggers>

</Configuration>


参考:

http://logging.apache.org/log4j/2.x/