SSM整合shiro实现认证和授权的简单案例

1.首先要搭建SSM框架

2.引入ssm相关依赖


    
      org.apache.shiro
      shiro-web
      1.2.2
    
    
      org.apache.shiro
      shiro-quartz
      1.2.2
    
    
      org.apache.shiro
      shiro-spring
      1.2.2
    

基本ssm框架整合其他技术都是在spring中引入一个bean实现整合(小白自己的理解)

3.在web.xml中配置shiro的

 
    
    
        shiroFilter
        org.springframework.web.filter.DelegatingFilterProxy
        
            
            targetFilterLifecycle
            true
        
    
    
        shiroFilter
        /*
    

shiro也是通过过滤器进行拦截的,filter进行拦截过后找到spring中所配置的过滤链,shiro中提供了很多filter

4.配置spring-shiro

 
    
        
        
        
        
        
        
        
        
        
            
                
            
        
        
            
                /login.action=authc
            
        
    
    
    
        
    
    
    
    
    
        
    

其中有几点需要注意:

1. 配置的LoginURL就是登录界面, 而不是表单的提交界面

2.successURL只是 一种附属配置,当认证成功后session中保存的是上一次 请求的URL, 所以认证成功后并不会跳转到successurl,而是跳转到上一次 请求的URL也就是返回Loginurl登陆界面。一正常情况下成功返回login,在controller中处理失败跳转的页面。当然也可以通过重载 formauthenticafilter的方法来实现successURL的跳转

3.shiro中的过滤器

208783.jpg

5.重写authorizingrealm

public class CustomRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;
    @Override
    public String getName() {
        return "CustomRealm";
    }
    /*实现授权的方法*/
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String userCode=(String)principals.getPrimaryPrincipal();
        List role=userService.role(userCode);
        SimpleAuthorizationInfo simpleAuthorizationInfo=new SimpleAuthorizationInfo();
        simpleAuthorizationInfo.addRoles(role);
        return simpleAuthorizationInfo;
    }
    /*实现认证的方法*/
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
       /*从token中取出用户凭证*/
        String userCode=(String)token.getPrincipal();
        User user=userService.login(userCode);
        System.out.println(user);
        if(user!=null){
            String password=user.getPassword();
            System.out.println(password);
                SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(userCode, password, this.getName());
                return simpleAuthenticationInfo;
        }
        return null;
    }
}

6.controller

 @RequestMapping(value = "/check.action")
    public String check(@RequestParam("username")String username,@RequestParam("password")String password) {
        if(username!=null && password!=null){
            Subject subject= SecurityUtils.getSubject();
            UsernamePasswordToken token=new UsernamePasswordToken(username,password);
            try{
                subject.login(token);
                return "success";
            }catch (Exception e){
                e.printStackTrace();
            }
        }else{
            System.out.println("请输入用户名或密码");
        }
        return "login";
    }

shiro认证的总结: 用户登录是在一个表单中进行的,所以需要通过shiro的一个表单过滤器(formauthenticationfilter)进行实现的,其原理如下:

用户没有认证时,请求Loginurl进行认证,输入信息后点击提交数据到LoginURL,然后formauthenticationfilter过滤器进行拦截取出其中的username和password(表单中的用户名和密码智能是username和password), 如果想改动的话可以在spring-shiro文件中进行配置formauthenticationfilter重新对其命名。然后formauthenticationfilter会调用realm传入一个token(token里面封装这用户信息),realm认证时根据username在数据库只能怪查询用户信息,然后返回一个SimplAuthenticationInfo(进行校验)。

 

 

有些controller代码只处理 错误信息返回错误界面,controller中

Subject subject= SecurityUtils.getSubject();
UsernamePasswordToken token=new UsernamePasswordToken(username,password);
subject.login(token);

其实在formauthenticationfilter内部 就已经调用了的。但是我把loginurl配置成登录界面formauthenticationfilter根本就不进行拦截,所以根本不能进入realm,所以 只能在controller中自己 动手获取username和password然后login()。如果有大牛知道哪里错的话,希望能够帮忙指点哪里不对。

你可能感兴趣的:(shiro)