栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot 第十篇 集成Shiro入门(安全)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot 第十篇 集成Shiro入门(安全)

目录
  • 1、搭建环境
    • 1.1、依赖
    • 1.2、创建mysql数据库
    • 1.3、创建实体类映射类
  • 2、基础配置
    • 2.1、编写配置文件
    • 2.2、创建授权认证了类
    • 2.2.1、授权方法
    • 2.2.2、认证方法
  • 3、编写业务代码
    • 3.1、持久层查询用户信息
    • 3.2、业务层直接调用
    • 3.3、控制层
      • 3.3.1、首页、新增、修改页面
      • 3.3.2、登录页面
      • 3.3.3、登录器
      • 3.3.4、未授权用户跳转页面
    • 3.4、视图层代码
      • 3.4.1、首页
      • 3.4.2、登录页面

1、搭建环境 1.1、依赖

省略了mysql mybatis等依赖包


    org.apache.shiro
    shiro-spring
    1.7.1



    log4j
    log4j
    1.2.17



    com.github.theborakompanioni
    thymeleaf-extras-shiro
    2.0.0

1.2、创建mysql数据库

1.3、创建实体类映射类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private int id;
    private String name;
    private String pwd;
    private String perms;

}

2、基础配置 2.1、编写配置文件
@Configuration
public class ShiroConfig {

    
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }

    //1.创建realm对象 1
    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }

    //2.DafaultWebSecurityManager
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //关联UserRealm
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
    }

    //3.ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {

        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //关联安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        //添加shiro的内置过滤器
        
//        filterMap.put("/user/add", "authc");//add 页面无需权限
//        filterMap.put("/user/edit", "authc");//编辑页面需要登录
        linkedHashMap filterMap = new linkedHashMap<>();
        filterMap.put("/user/*", "authc");
        //授权,正常情况下,没有授权会跳转到登录页面
        filterMap.put("/user/*","perms[user:add]");

        bean.setFilterChainDefinitionMap(filterMap);
        //设置登录页面
        bean.setLoginUrl("/toLogin");
        //未授权跳转的页面
        bean.setUnauthorizedUrl("/noauth");
        return bean;
    }
}

2.2、创建授权认证了类
public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserService userService;
}
2.2.1、授权方法
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

    System.out.println("执行了授权方法");
    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    //拿到当前登录的这个对象
    Subject subject = SecurityUtils.getSubject();
    User cuurentUser = (User) subject.getPrincipal();
    //设置当前用户的权限 当然也可以授权角色
    info.addStringPermission(cuurentUser.getPerms());
    return info;
}
2.2.2、认证方法
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

    System.out.println("执行了认证方法");
    UsernamePasswordToken userToken = (UsernamePasswordToken)authenticationToken;

    //连接真实等数据库
    User user = userService.queryUserByName(userToken.getUsername());
    //判断是否有这个账户
    if(user==null){
        return null;//UnknowAccountException
    }
    Subject currentSubject = SecurityUtils.getSubject();
    Session session = currentSubject.getSession();
    session.setAttribute("loginUser",user);
    //可以加密: MD5 MD5盐值加密

    //密码认证,shiro自动做  通过这里传递到doGetAuthorizationInfo
    return new SimpleAuthenticationInfo(user,user.getPwd(),"");
}
3、编写业务代码 3.1、持久层查询用户信息

     select * from user where name=#{name}

3.2、业务层直接调用
@Override
public User queryUserByName(String name) {
    return userMapper.queryUserByName(name);
}
3.3、控制层 3.3.1、首页、新增、修改页面
@RequestMapping({"/", "index"})
public String toIndex(Model model) {
    model.addAttribute("msg", "hello shiro");
    return "index";
}

@RequestMapping("/user/add")
public String add() {
    return "user/add";
}

@RequestMapping("/user/edit")
public String edit() {
    return "user/edit";
}
3.3.2、登录页面

bean.setLoginUrl("/toLogin");

@RequestMapping("/toLogin")
public String toLogin() {
    return "login";
}
3.3.3、登录器
@RequestMapping("/login")
public String login(String username, String password,Model model) {
    //获取当前用户
    Subject subject = SecurityUtils.getSubject();
    //封装用户对登录数据
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    //执行登录等方法,如果没有异常说明登录成功
    try {
        subject.login(token);

        return "index";
    } catch (UnknownAccountException e) {
        model.addAttribute("msg","用户名错误");
        return "login";
    }catch (IncorrectCredentialsException e){
        model.addAttribute("msg","密码错误");
        return "login";
    }

}
3.3.4、未授权用户跳转页面

bean.setUnauthorizedUrl("/noauth");

@RequestMapping("/noauth")
@ResponseBody
public String unauthorized(){
 	return "未授权无法访问页面";
}
3.4、视图层代码 3.4.1、首页




    
    Title


首页

登录


add
3.4.2、登录页面



    
    Title


用户名:

密码:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667874.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号