转自https://blog.csdn.net/gaoduicai/article/details/79300464前端
业务场景是:登陆时根据每一个人电脑MAC地址作权限校验,所以研究了一下jeesite的登陆业务java
登陆后跳操做理解web
首先配置中jeesite.properties中设置:spring
adminPath=/a :项目管理端域名数据库
frontPath=/f :前端域名apache
<form id="loginForm" class="form login-form" action="${ctx}/login" method="post">缓存
点击登陆会经过springmvc至后台colltrer控制器安全
经过控制器类可知道:session
@RequestMapping(value = "${adminPath}/login", method = RequestMethod.GET)mvc
mapping请求地址会被相关拦截器拦截;成功
<!-- 拦截器配置,拦截顺序:先执行后定义的,排在第一位的最后执行。-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="${adminPath}/**" />
<mvc:mapping path="/rest/**" />
<mvc:exclude-mapping path="${adminPath}/"/>
<mvc:exclude-mapping path="${adminPath}/login"/>
<mvc:exclude-mapping path="${adminPath}/sys/menu/tree"/>
<mvc:exclude-mapping path="${adminPath}/sys/menu/treeData"/>
<mvc:exclude-mapping path="${adminPath}/oa/oaNotify/self/count"/>
<bean class="com.thinkgem.jeesite.modules.sys.interceptor.LogInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
return return "modules/sys/sysLogin";(此处则为登陆界面jsp)至此访问应用之登陆jsp前端完成;
下来时登陆页面跳转:
shiro的登录功能在controller以前加入了一个filter。这个filter被配置在文件spring-context-shiro.xml文件里;
<!-- Shiro权限过滤过滤器定义 --> <bean name="shiroFilterChainDefinitions" class="java.lang.String"><!-- 配置shiro要拦截的请求 --> <constructor-arg> <value> /static/** = anon /userfiles/** = anon ${adminPath}/cas = cas ${adminPath}/login = authc ${adminPath}/logout = logout ${adminPath}/** = authc /act/editor/** = user /ReportServer/** = user /rest/** = anon /chat/** = authc </value> </constructor-arg> </bean> <!-- 安全认证过滤器 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /><!-- <property name="loginUrl" value="${cas.server.url}?service=${cas.project.url}${adminPath}/cas" /> --> <property name="loginUrl" value="${adminPath}/login" /> <property name="successUrl" value="${adminPath}?login" /><!-- 登陆成功跳转页面 --> <property name="filters"> <map> <entry key="cas" value-ref="casFilter"/> <entry key="authc" value-ref="formAuthenticationFilter"/> <entry key="logout" value-ref="systemLogoutFilter" /> </map> </property> <property name="filterChainDefinitions"> <ref bean="shiroFilterChainDefinitions"/> </property> </bean>
以上就是配置过程最关键的部分。loginUrl属性所指定的url表示的是全部未经过验证的url所访问的位置,此处就是登陆界面;
successUrl表示的是成功登录的url访问的位置,此处就是主页。filters则是配置具体验证方法的位置。
在此处,${adminPath}/login = authc指定了/a/login,既登录页面,所须要的验证权限名为authc,又配置了authc所用的
filter为formAuthenticationFilter。
所以整个逻辑是:若是任何地方未登录,则访问/a/login页面,而/a/login页面的验证权限中又指定了formAuthenticationFilter
作为过滤,若是过滤中验证成功,则访问/a这个主页。因此,login.jsp中的表单信息则首先交由formAuthenticationFilter首先处理。
formAuthenticationFilter中建立createToken ,在这里建立token的时候属性需添加mac地址
<!-- 定义Shiro安全管理配置 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="systemAuthorizingRealm" /><!--读取数据文件--> <property name="sessionManager" ref="sessionManager" /><!-- 管理会话信息 --> <property name="cacheManager" ref="shiroCacheManager" /><!--管理shiro缓存 --> </bean>
在systemAuthorizingRealm进行数据安全权限校验,在这里能够经过token中mac地址和数据库中数据进行比对,若是不匹配,返回验证信息
后台shiro
Shiro在注解模式下,登陆失败,与没有权限均是经过抛出异常。而且默认并无去处理或者捕获这些异常。在springMVC下须要配置捕获
相应异常来通知用户信息,若是不配置异常会抛出到页面
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="org.apache.shiro.authz.UnauthorizedException">error/403</prop> <prop key="java.lang.Throwable">error/500</prop> </props> </property> </bean>