本文介绍一个简单的权限管理系统,采用springmvc+mybatis+shiro+MySQL,前端主要是用了JSP+jquery框架。springMVC、shiro、mybatis这些,外面的资料很多,这里就不解释了。项目提供源码,可以运行。
-----------------------------------------------------------
数据库设计
om_user:用户表。
om_role:角色表。
user_role:用户-角色关系表,一个用户可以拥有多个角色,一个角色可以对应多个用户。
om_permis:权限表。
role_permis:角色-权限关系表,一个角色可以对应多个权限,一个权限可以被多个角色拥有。
om_menu:菜单表,菜单和权限一一对应,其实菜单就是权限的具体表现。
om_role:角色表。
user_role:用户-角色关系表,一个用户可以拥有多个角色,一个角色可以对应多个用户。
om_permis:权限表。
role_permis:角色-权限关系表,一个角色可以对应多个权限,一个权限可以被多个角色拥有。
om_menu:菜单表,菜单和权限一一对应,其实菜单就是权限的具体表现。
数据库设计模型图:
-----------------------------------------------------------
后台部分:
springMVC+mybatis+MySQL
代码结构:
权限设置:
MenuController.java中,菜单url上都有@RequiresPermissions注解,如人事部菜单的注解为:@RequiresPermissions("personnel_department"),表示登录用户必须拥有"personnel_department"这个权限编码才能访问
/**
* 人事部页面
*
* @return
*/
@RequiresPermissions("personnel_department")
@RequestMapping("personnel_department")
public String personnelDepartment(HttpServletRequest request) {
logger.info("============人事部=============");
return "menu/personnel_department";
}
配置说明:
1.shiro配置文件:beans-shiro.xml
<!-- spring-shiro权限管理过滤器,这里的id要等于web.xml中的shiro配置的filter-name -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 调用自定义授权认证管理器 -->
<property name="securityManager" ref="securityManager" />
<!-- 配置登录地址 -->
<property name="loginUrl" value="/login" />
<!-- 登录成功后跳转的地址 -->
<property name="successUrl" value="/home" />
<!-- 非法访问时,跳转的地址 -->
<property name="unauthorizedUrl" value="/403" />
<!-- 自定义filter配置 -->
<!-- <property name="filters">
<util:map>
<entry key="authc">
<bean class="com.plg.shiro.filter.shiro.UserAuthenticationFilter"/>
</entry>
</util:map>
将自定义 的FormAuthenticationFilter注入shiroFilter中
<map>
<entry key="authc" value-ref="formAuthenticationFilter" />
</map>
</property> -->
<!-- 配置权限拦截的路径,以及认证方式 -->
<property name="filterChainDefinitions">
<value>
<!-- anon表示此地址不需要任何权限即可访问 -->
/login = anon
/logout = anon
/static/** = anon
/403 = anon
/home = anon
<!-- 所有的请求(除去配置的静态资源请求或请求地址为anon的请求)都要通过登录验证,如果未登录则跳到unauthorizedUrl指定的url -->
/** = authc
</value>
</property>
</bean>
2.springmvc-servlet.xml,特别注意Shiro内部lifecycle函数的bean的生命周期配置房子springmvc配置文件中,否则在controller上使用shiro的注解就不起作用了。
<!-- 保证实现了Shiro内部lifecycle函数的bean执行,一定要放在spring-mvc的配置文件中,某则放在Controller层的shiro注解(如@RequiresPermissions等)就不起作用 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
<!-- BEGIN SHIRO对Controller方法级安全控制的AOP支持 -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor">
<property name="proxyTargetClass" value="true" />
</bean>
-----------------------------------------------------------
系统介绍:
系统预设了三个用户(登录密码为:123456),对应的三个角色和若干权限。
用户:super_admin > middle_admin > common_admin
角色:super_admin_role > middle_admin_role > common_admin_role
登录页面:
登录成功之后:
权限验证失败:
用户名/密码错误或者访问了没有权限验证的页面时,如上图,middle_admin用户没有权限访问人事部页面的权限,但是在登录成功后,输入人事部页面的url:http://127.0.0.1:8080/springmvc-mybatis-shiro/menu/personnel_department
登录/验证时序图:
项目git地址
https://gitee.com/plg17/springmvc-mybatis-shiro.git
到此!