基于spring的shiro配置
shiro是一个特别简单,易用的框架,在此记录一下shiro的使用配置。
首先,创建四张表:user role user_role permission,分别为用户、角色、用户与角色关系表和权限表。
user表结构:
role表结构:
user_role
permission
当然,表结构如何设计是没有关系的,你可以根据自己偏好设计。
web.xml中加入shiro的过滤器:
<filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping><filter-name>shiroFilter</filter-name><url-patte>/*</url-patte> </filter-mapping>
然后配置shiro,可以写在spring的配置文件中,也可以另起一个配置文件,配置内容如下:
<!-- 配置权限管理器 --> <bean id="myShiro" class="com.itmayong.util.MyShrio"></bean><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- 我们自定义的realm --> <property name="realm" ref="myShiro"/><!-- 缓存管理器 --> <property name="cacheManager" ref="cacheManager"/></bean><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- 权限管理器 --><property name="securityManager" ref="securityManager"/><!-- 登录地址 --><property name="loginUrl" value="/login.jsp"/><!-- 登录后跳转到业务页面 --> <property name="successUrl" value="/main.jsp"/><!-- 错误页面 --> <property name="unauthorizedUrl" value="/error.jsp"/><!-- 权限配置 --> <property name="filterChainDefinitions"><value><!-- anon无权限访问请求,此处是登录页面和登录请求 --> /login.do = anon/static/**=anon <!-- 需要权限为add的用户才能访问此请求--> /user=perms[user:add] <!-- 需要管理员角色才能访问此页面 --> /user/add=roles[admin] <!--拦截非静态资源的所有请求-->/** = authc </value></property></bean> <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" /><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
上面的配置文件我们指定了自定义的realm,内容如下:
public class MyShrio extends AuthorizingRealm{@Autowired private UserServiceIf userService; /** * 权限认证,获取登录用户的权限 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { String loginName=(String) principalCollection.fromRealm(getName()).iterator().next(); //此处连库匹配了登录用户的数据,具体怎么做,需要根据个人需求而定User user=userService.findByName(loginName); List<Role> list = user.getRoleList();if(user!=null){ SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); //获取用户的角色名称info.setRoles(user.getRolesName()); //获取用户的权限List<Role> roleList=user.getRoleList(); for (Role role : roleList) { info.addStringPermissions(role.getPermissionsName()); } retu info; } retu null; }/** * 登录认证,创建用户的登录信息 */ @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken authenticationToken) throws AuthenticationException { UseamePasswordToken token=(UseamePasswordToken) authenticationToken; //判断用户登录状态User user=userService.findByName(token.getUseame()); if(user!=null){ //保存用户登录信息到认证中retu new SimpleAuthenticationInfo(user.getUseame(), user.getPassword(), getName()); } retu null; }}
最后,你可以写一个页面和Controller进行测试了,当然也可以细分一下权限和角色,以应用到实际更复杂的场景中。
页面内容可以使用下边的方式对需要角色和权限控制的内容进行包裹,以达到权限控制的目的。
<shiro:hasRole name="admin">需要管理员角色</shiro:hasRole><shiro:hasPermission name="add">需要add权限</shiro:hasPermission>
此文为记录文章,防止自己以后又忘记,当然,如果能帮助到想用shiro的人更好。如果错误,请多多包涵
作者:闻鸡睡觉
来源链接:https://www.cnblogs.com/dreamowneryong/p/5610748.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。