该功能只是搭建了一个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信息查询对应权限,将其显示到前端页面
下面是代码部分
前端页面:
regest.jsp和login.jsp(注:由于shiro设置了登陆不成功自动跳转登陆页面,而且如果登陆页面在web-inf下,是访问不到的------可以复制一份到web-inf外)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
注册页面
注册
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
登录页面
${error }
${user.username }
${user.password }
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处理登陆请求:
@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";
}
}
依赖坐标:
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文件:
contextConfigLocation
classpath:spring/spring-shiro.xml
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
targetFilterLifecycle
true
shiroFilter
/*
spring整合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);
}
}
登陆成功后的跳转页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>
登录成功页面
恭喜${user.username },登陆成功
全部权限如下:
- 增
- 删
- 改
- 查
用户${user.username}的权限是:
- 增
- 删
- 改
- 查