• ssm整合shiro


    企业中老项目还在使用ssm框架。

    (1)创建一个maven的web工程。

    (2)ssm整合到web工程----省略

    pom依赖

    spring配置文件

    web.xml配置文件

    (3)整合shiro

    1. 引入shiro的依赖

     
       
          org.apache.shiro
          shiro-spring
          1.9.0
       

    2. 修改spring配置文件  

    1. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    2. <property name="realm" ref="realm"/>
    3. bean>
    4. <bean id="realm" class="com.ykq.realm.MyRealm">
    5. <property name="credentialsMatcher" ref="credentialsMatcher"/>
    6. bean>
    7. <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
    8. <property name="hashAlgorithmName" value="MD5"/>
    9. <property name="hashIterations" value="1024"/>
    10. bean>
    11. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    12. <property name="loginUrl" value="/login.jsp"/>
    13. <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
    14. <property name="filterChainDefinitions">
    15. <value>
    16. /login=anon
    17. /**=authc
    18. value>
    19. property>
    20. bean>

    shiro中内置很多过滤器,而每个过滤都有相应的别名.

    修改web.xml文件

    1. <filter>
    2. <filter-name>shiroFilterfilter-name>
    3. <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
    4. filter>
    5. <filter-mapping>
    6. <filter-name>shiroFilterfilter-name>
    7. <url-pattern>/*url-pattern>
    8. filter-mapping>

     修改controller层

    1. @PostMapping("/login")
    2. public String login(String username,String password){
    3. Subject subject = SecurityUtils.getSubject();
    4. UsernamePasswordToken token=new UsernamePasswordToken(username,password);
    5. try {
    6. subject.login(token);
    7. return "redirect:/success.jsp";
    8. }catch (Exception e){
    9. return "redirect:/login.jsp";
    10. }
    11. }

    realm:  

    1. //AuthorizingRealm授权
    2. public class MyRealm extends AuthorizingRealm {
    3. @Autowired
    4. private UserService userService;
    5. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    6. User user = (User) principalCollection.getPrimaryPrincipal();
    7. List list = userService.findPermissionByUsername(user.getUserid());
    8. //把当前用户的权限封装到SimpleAuthorizationInfo SimpleAuthorizationInfo进行权限校验
    9. if (list!=null&&list.size()>0){
    10. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    11. info.addStringPermissions(list);
    12. return info;
    13. }
    14. return null;
    15. }
    16. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    17. //1. 根据token获取账号
    18. String username = (String) authenticationToken.getPrincipal();
    19. // System.out.println(username+"+++++++++++++++++++++++++");
    20. //2. 根据账号查询用户信息
    21. User user = userService.findByUsername(username);
    22. if (user!=null){
    23. //从数据库中获取密码
    24. //盐
    25. ByteSource byteSourceSalt=ByteSource.Util.bytes(user.getSalt());
    26. SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getUserpwd(),byteSourceSalt,this.getName());
    27. return info;
    28. }
    29. return null;
    30. }
    31. }

    2.完成ssm整合shiro

    2.1 进入主页后,不同的用户可以看到不同的内容。

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
    3. <html>
    4. <head>
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <h1>欢迎来到<shiro:principal property="username"/>的主页h1>
    9. <shiro:hasPermission name="user:query">
    10. <a href="/user/query">查询用户a>
    11. shiro:hasPermission>
    12. <shiro:hasPermission name="user:insert">
    13. <a href="/user/insert">增加用户a>
    14. shiro:hasPermission>
    15. <shiro:hasPermission name="user:delete">
    16. <a href="/user/delete">删除用户a>
    17. shiro:hasPermission>
    18. <shiro:hasPermission name="user:update">
    19. <a href="/user/update">修改用户a>
    20. shiro:hasPermission>
    21. <shiro:hasPermission name="user:export">
    22. <a href="/user/export">导出用户a>
    23. shiro:hasPermission>
    24. body>
    25. html>

    可以在jsp中获取当前登录者的账号

    上面只是在网页中根据不同用户显示不同的菜单,这种方式只能防君子不能防小人。

    1. 拦截器---获取请求路径 然后根据你的路径判断当前用户是否具有该权限。

    2. spring整合shiro时提供了一个注解:可以加载相应方法上。

    1. 1.开启shiro注解
    2. <bean id="lifecycleBeanPostProcessor"
    3. class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
    4. <bean
    5. class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
    6. depends-on="lifecycleBeanPostProcessor" />
    7. <bean
    8. class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    9. <property name="securityManager" ref="securityManager" />
    10. bean>
    11. 2.使用shiro注解
    12. @RequiresPermissions(value = {"/user/query","/user/aaa"},logical= Logical.OR)

     

      全局异常处理:

       3. ssm整合shiro完成前后端分离

    3. ssm整合shiro完成前后端分离

    所谓前后端完全分离:后端响应的都是json数据,而不再是网页。

    1. 登录成功或者失败应该返回json数据
    2. 当未登录时返回的也是json数据
    3. 访问未授权的资源,也要分会json。

    3.1 登录成功或者失败应该返回json数据

    修改登录接口  

    3.2 当未登录时返回的也是json数据

    创建一个过滤器,继承登录校验的某个接口。

    1. public class LoginFilter extends FormAuthenticationFilter {
    2. //没有登陆时经过该方法 要返回json数据必须重写该方法
    3. @Override
    4. protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
    5. response.setContentType("application/json;charset=utf-8");
    6. PrintWriter writer = response.getWriter();
    7. CommonResult commonResult = new CommonResult(4001,"未登录",null);
    8. ObjectMapper objectMapper = new ObjectMapper();
    9. String json = objectMapper.writeValueAsString(commonResult);
    10. writer.print(json);//显影给客户json
    11. writer.flush();
    12. writer.close();
    13. return false;
    14. }
    15. }

     (2)注册我们的过滤器

    3.3 如果没有权限应该返回json数据

     

     

  • 相关阅读:
    趣味算法图解,高清无码图免费下载
    TiDB | 来说说TiEM初体验吧
    接手了一个外包开发的项目,我感觉我的头快要裂开了~
    【数据结构】线段树
    树莓派 RaspBerryPi 网络配置相关与改造usb网络摄像头
    【Opencv实战】识别水果的软件叫什么?一款超好用的识别软件分享,一秒鉴定(真是活~久~见~啊)
    java 企业工程管理系统软件源码 自主研发 工程行业适用
    “美亚杯”第二届中国电子数据取证大赛答案解析(个人赛)
    5G 时代音视频开发前景怎么样?音视频开发需要掌握哪些技术?
    Crack:Stimulsoft BI Server 2022.4.5
  • 原文地址:https://blog.csdn.net/qq_59114219/article/details/126218465