ssm搭建shiro安全框架
2017-06-20 15:28
507 查看
该功能只是搭建了一个shiro的框架,实现登陆验证和权限控制,其中的user信息和对应权限并没有连接数据库,是以本地变量代替
ssm中使用shiro框架包括这几个方面:
对应jar包或者maven坐标依赖, web.xml配置shiro fiter , shiro和spring整合的文件spring-shiro.xml, shiro自身组件(自定义的realm)
业务逻辑:只在登陆时调用shiro进行验证。
1.提交登陆(toLogin)请求后,controller层对应方法根据提交的user信息获取shiro相关内容,调用login方法(该方法shiro自带,结合自定义realm判断是否通过)
2.login方法内部调用shiro验证机制。我的realm组件验证时通过用户名获取用户信息,再提交给shiro进行验证。
3.调用login之前把客户端请求中的user信息保存到shiro相关组件,自定义的realm把查询到的user信息也保存在相关组件,shiro内部去验证。通过则允许登陆,不通过返回登陆页面
4.登陆成功后,自动调用权限模块,通过该user信息查询对应权限,将其显示到前端页面
下面是代码部分
点击注册后,controller中处理请求时顺便把密码加密(也可以不加),可以自定义一个工具类:我的叫MD5(map的方法只是为了少写一个类而已)
c08c
div>
这时因为登陆要调用shiro,引进下:
至此,登陆验证模块已经完成
接下来说一下权限控制模块:
(其实前面已经给出了代码,就是自定义realm中的权限模块和loginsuccess.jsp提到的权限,只需要把自定义realm注掉的list值放开,就可以看到效果)
运行情况
注册:
登陆失败:(故意填写密码错误)
登陆成功:(顺便显示了user信息和对应的权限)
总结:
1.shiro主要时配置部分会麻烦一点,其中的组件有多个,一开始可以不用给密码加密,这样就省了MD5工具类和自定义加密类
2.shiro权限显示到前台从代码可以何处和if语句有点类似,name是一致就显示,否则就不显示。需要煮一下shiro表情是jstl表达式引进的
3.未登录和登陆失败自动跳转到login.jsp注意的就是web-inf下的文件不能直接访问,最好复制一份,可以改变一些无关紧要的内容区别一下就可以看出来
LG
ssm中使用shiro框架包括这几个方面:
对应jar包或者maven坐标依赖, web.xml配置shiro fiter , shiro和spring整合的文件spring-shiro.xml, shiro自身组件(自定义的realm)
业务逻辑:只在登陆时调用shiro进行验证。
1.提交登陆(toLogin)请求后,controller层对应方法根据提交的user信息获取shiro相关内容,调用login方法(该方法shiro自带,结合自定义realm判断是否通过)
2.login方法内部调用shiro验证机制。我的realm组件验证时通过用户名获取用户信息,再提交给shiro进行验证。
3.调用login之前把客户端请求中的user信息保存到shiro相关组件,自定义的realm把查询到的user信息也保存在相关组件,shiro内部去验证。通过则允许登陆,不通过返回登陆页面
4.登陆成功后,自动调用权限模块,通过该user信息查询对应权限,将其显示到前端页面
下面是代码部分
前端页面:
regest.jsp和login.jsp(注:由于shiro设置了登陆不成功自动跳转登陆页面,而且如果登陆页面在web-inf下,是访问不到的------可以复制一份到web-inf外)注册页面注册
姓名: 密码: 重写 注册
登录页面 用户名: 密码: ${error } ${user.username } ${user.password }
点击注册后,controller中处理请求时顺便把密码加密(也可以不加),可以自定义一个工具类:我的叫MD5(map的方法只是为了少写一个类而已)
public class MD5 { //以username作为‘盐’,加3次来给密码加密(Md5Hash方法内部逻辑) public static String getMD5Hash(String username,String password){ return new Md5Hash(password, username, 3).toString(); } //代替数据库暂时存储user信息 public static Map map = new HashMap(); public static Map getMap(){ return map; } }
controller处理注册请求:
我是直接重定向到登陆页面(注:由于时在map中存的user信息,所以每次重启项目后都要从注册开始,不然map为空)@RequestMapping("regest") public String regesteeeee(){ return "regest"; } @RequestMapping("toRegest") public String toRegest(String username,String password){ User user = new User(); user.setUsername(username); String ps = MD5.getMD5Hash(username, password); user.setPassword(ps); MD5.getMap().put(username,user); return "redirect:/login"; }
controller处理登陆请求:
<c08c
div>
@RequestMapping("login") public String helloasdfda(){ return "login"; } @RequestMapping("success") public String toSuccess(){ return "loginsuccess"; } @RequestMapping("toLogin") public String toLogin(User user,Model m){ UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(),user.getPassword()); Subject subject = SecurityUtils.getSubject(); token.setRememberMe(true); try { subject.login(token); subject.getSession().setAttribute("user",user); return "redirect:/success"; } catch (Exception e) { m.addAttribute("user", user); m.addAttribute("error","用户名或密码错误"); return "login"; } }
这时因为登陆要调用shiro,引进下:
依赖坐标:
org.apache.shiro shiro-core 1.2.1 org.apache.shiro shiro-web 1.2.1 org.apache.shiro shiro-ehcache 1.2.1 org.apache.shiro shiro-spring 1.2.1
web.xml文件:
(注意其中的classpath要和自己的文件路径一致,拦截的url时 /* ,和下面文件中的 /** 不一样)contextConfigLocation classpath:spring/spring-shiro.xml shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /*
spring整合shiro文件:
其中涉及了一个realm和自定义加密算法,都是为了shiro服务的,和注册没有关系。/toLogin = anon /login = anon /regest = anon /toRegest = anon /** = authc
自定义realm
(后面再说权限模块)public class MyShiroRealm extends AuthorizingRealm{ //权限管理模块 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { //添加对应的权限,该部分后期可以根据user的信息查询数据库获取list代替 List list = new ArrayList(); list.add("增"); // list.add("删"); // list.add("改"); User user = (User) SecurityUtils.getSubject().getPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addStringPermissions(list); return info; } //登录验证模块 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken userToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) userToken; String u = token.getUsername(); //该部分后期根据user信息到数据库获取来替代 User user = MD5.getMap().get(u); String p = user.getPassword(); return new SimpleAuthenticationInfo(user,p,this.getName());//已在配置中引入加密算法 } }
自定义加密算法:
public class AuthCredential extends SimpleCredentialsMatcher{ //加密算法需要和注册时一致,即调用同一个MD5工具类,放入相同的参数 public boolean doCredentialsMatch(AuthenticationToken token,AuthenticationInfo info){ UsernamePasswordToken loginToken = (UsernamePasswordToken) token; String username = loginToken.getUsername(); char[] password = loginToken.getPassword(); String p = String.valueOf(password); String ps = MD5.getMD5Hash(username, p); loginToken.setPassword(ps.toCharArray()); return super.doCredentialsMatch(loginToken, info); } }
登陆成功后的跳转页面:
loginsuccess.jsp (包含了登陆成功后的user信息获取和对应权限)登录成功页面 恭喜${user.username },登陆成功 全部权限如下: 增 删 改 查 用户${user.username}的权限是: 增 删 改 查
至此,登陆验证模块已经完成
接下来说一下权限控制模块:
(其实前面已经给出了代码,就是自定义realm中的权限模块和loginsuccess.jsp提到的权限,只需要把自定义realm注掉的list值放开,就可以看到效果)
运行情况
注册:
登陆失败:(故意填写密码错误)
登陆成功:(顺便显示了user信息和对应的权限)
总结:
1.shiro主要时配置部分会麻烦一点,其中的组件有多个,一开始可以不用给密码加密,这样就省了MD5工具类和自定义加密类
2.shiro权限显示到前台从代码可以何处和if语句有点类似,name是一致就显示,否则就不显示。需要煮一下shiro表情是jstl表达式引进的
3.未登录和登陆失败自动跳转到login.jsp注意的就是web-inf下的文件不能直接访问,最好复制一份,可以改变一些无关紧要的内容区别一下就可以看出来
LG
相关文章推荐
- ssm+shiro框架搭建笔记(2)
- ssm环境下快速搭建shiro框架
- ssm+shiro框架搭建笔记(3)
- ssm+shiro框架搭建笔记(5)
- 快速搭建springboot框架以及整合ssm+shiro+安装Rabbitmq和Erlang、Mysql下载与配置
- ssm+shiro基础框架搭建(二)
- ssm+shiro框架搭建笔记(7)
- SSM集成安全框架shiro
- ssm+shiro框架搭建笔记(4)
- ssm+shiro基础框架搭建(一)
- ssm+shiro框架搭建笔记(1)
- 搭建第一个shiro安全框架。
- 安全框架 精美的shiro
- shiro安全框架扩展教程--如何自定义适合项目的过滤器
- java开发SSM框架的搭建(SpringMVC+Spring+MyBatis)
- shiro安全框架扩展教程--如何扩展实现集中式session管理
- shiro安全框架扩展教程--如何扩展异步(ajax)请求认证失败处理
- Java开源安全框架之Apache Shiro
- shiro安全框架扩展教程--基本行级数据安全控制
- shiro安全框架|基础知识:登录逻辑