本文共 7498 字,大约阅读时间需要 24 分钟。
小伙伴们,以下仅是干货哦(思路)
基于SSM(Spring+SpringMVC+Mybatis)框架做的思路哦
首先在使用Shiro的时候我们要考虑在什么样的环境下使用:
基本上我们也就这三个需求,所以同时我们也需要三个方法:
findUserByUserName(String username)
根据username查询用户,之后Shiro会根据查询出来的User的密码来和提交上来的密码进行比对。findRoles(String username)
根据username查询该用户的所有角色,用于角色验证。findPermissions(String username)
根据username查询他所拥有的权限信息,用于权限判断。
Mapper 代码
现在就需要创建自定义的id, username, password,roleId
MyRealm
类,这个还是比较重要的。继承至 Shiro
的 AuthorizingRealm
类,用于处理自己的验证逻辑,下面贴一下我的代码:
MyRealm类
package com.crossoverJie.controller;import com.crossoverJie.pojo.T_user;import com.crossoverJie.service.T_userService;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;/** * Created with IDEA * Created by ${jie.chen} on 2016/7/14. * 后台Controller */@Controller@RequestMapping("/")public class T_userController { @Resource private T_userService t_userService ; @RequestMapping("/loginAdmin") public String login(T_user user, Model model){ Subject subject = SecurityUtils.getSubject() ; UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(),user.getPassword()) ; try { subject.login(token); return "admin" ; }catch (Exception e){ //这里将异常打印关闭是因为如果登录失败的话会自动抛异常// e.printStackTrace(); model.addAttribute("error","用户名或密码错误") ; return "../../login" ; } } @RequestMapping("/admin") public String admin(){ return "admin"; } @RequestMapping("/student") public String student(){ return "admin" ; } @RequestMapping("/teacher") public String teacher(){ return "admin" ; }}主要就是
login()
方法。逻辑比较简单,只是登录验证的时候不是像之前那样直接查询数据库然后返回是否有用户了,而是调用subject
的login()
方法,就是我上面提到的,调用login()
方法时Shiro
会自动调用我们自定义的MyRealm
类中的doGetAuthenticationInfo()
方法进行验证的,验证逻辑是先根据用户名查询用户,如果查询到的话再将查询到的用户名和密码放到SimpleAuthenticationInfo
对象中,Shiro会自动根据用户输入的密码和查询到的密码进行匹配,如果匹配不上就会抛出异常,匹配上之后就会执行doGetAuthorizationInfo()
进行相应的权限验证。doGetAuthorizationInfo()
方法的处理逻辑也比较简单,根据用户名获取到他所拥有的角色以及权限,然后赋值到SimpleAuthorizationInfo
对象中即可,Shiro就会按照我们配置的XX角色对应XX权限来进行判断,这个配置在下面的整合中会讲到。
web.xml配置
首先我们需要在web.xml
进行配置Shiro的过滤器。
配置还是比较简单的,这样会过滤所有的请求。 之后我们还需要在Spring中配置一个shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /*
shiroFilter
的bean。
spring-mybatis.xml配置
/loginAdmin=anon /admin*=authc /student=roles[teacher] /teacher=perms["user:create"]
在这里我们配置了上文中所提到的自定义myRealm,这样Shiro就可以按照我们自定义的逻辑来进行权限验证了。其余的都比较简单,看注释应该都能明白。着重讲解一下:
teacher
角色,不然是不能进行访问的。user:create
权限才能进行访问的。 更多相关权限过滤的资料可以访问shiro的官方介绍Shiro还有着强大标签库,可以在前端帮我获取信息和做判断。
要想使用Shiro标签,只需要引入一下标签即可:<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
其实英语稍微好点的童鞋应该都能看懂。下面我大概介绍下一些标签的用法:
admin
角色才会显示标签内的信息。Subject.getPrincipal()
获取,即 Primary Principal。user:create
这个权限才回显示标签内的信息。再分享一个Shiro封装的MD5加密
代码非常简单,只需要调用Md5Hash(str,salt)
方法即可,这里多了一个参数,第一个参数不用多解释,是需要加密的字符串。第二个参数salt
中文翻译叫盐,加密的时候我们传一个字符串进去,只要这个salt不被泄露出去,那原则上加密之后是无法被解密的,在存用户密码的时候可以使用,感觉还是非常屌的。
小伙伴们试试吧 !!!!!!!!!!!!!!!!!!!
转载地址:http://ejooa.baihongyu.com/