ssm搭建shiro安全框架

该功能只是搭建了一个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 }

点击注册后,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处理登陆请求:

@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信息获取和对应权限)
<%@ 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}的权限是:

至此,登陆验证模块已经完成

接下来说一下 权限控制模块
(其实前面已经给出了代码,就是自定义realm中的权限模块和loginsuccess.jsp提到的权限,只需要把自定义realm注掉的list值放开,就可以看到效果)


运行情况
注册:

登陆失败:(故意填写密码错误)

登陆成功:(顺便显示了user信息和对应的权限)



总结:
1.shiro主要时配置部分会麻烦一点,其中的组件有多个,一开始可以不用给密码加密,这样就省了MD5工具类和自定义加密类
2.shiro权限显示到前台从代码可以何处和if语句有点类似,name是一致就显示,否则就不显示。需要煮一下shiro表情是jstl表达式引进的
3.未登录和登陆失败自动跳转到login.jsp注意的就是web-inf下的文件不能直接访问,最好复制一份,可以改变一些无关紧要的内容区别一下就可以看出来



LG

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LUNG108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值