会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132647个问题


我照着敲的,访问时候弹出这个

image.png

package com.security.handle;

import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author  liufupeng
 * @date  2021/5/11
 */
@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {

        httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
        httpServletResponse.setContentType("application/json:charset=utf-8");
        PrintWriter writer = httpServletResponse.getWriter();
        writer.println("{\"code\":\"403\",\"msg\":\"无权限\"}");
        writer.flush();
        writer.close();
    }


}
package com.security.config;

import com.security.handle.MyAccessDeniedHandler;
import com.security.handle.MyAuthenticationFailHandler;
import com.security.handle.MyAuthenticationSuccessHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @author liufupeng
 * @date 2021/5/8
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyAccessDeniedHandler myAccessDeniedHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        // 表单认证
        http.formLogin()
                .loginProcessingUrl("/login") // 当发现/login时认为是登陆,需要执行UserDetailsServiceImpl
//                .successForwardUrl("/toMain") // 登陆成功 此处为post请求
//                .failureForwardUrl("/fail")
                .usernameParameter("username") //自定义username字段
                .passwordParameter("password")
                .successHandler(new MyAuthenticationSuccessHandler("/toMain"))
                .failureHandler(new MyAuthenticationFailHandler("/fail.html"))
                .loginPage("/login.html");

        //  url 拦截
        http.authorizeRequests()
                .antMatchers("/login.html", "/fail.html").permitAll() // 登陆不需要被认证
//                .antMatchers("/main1.html").hasAuthority("admin")
                .antMatchers("/main1.html").hasIpAddress("127.0.0.1")
                .anyRequest().authenticated();

        http.csrf().disable();

        http.exceptionHandling()
                .accessDeniedHandler(myAccessDeniedHandler);
    }

    @Bean
    public PasswordEncoder getPe() {
        return new BCryptPasswordEncoder();
    }
}


JAVA 全系列/第九阶段:权限控制与安全认证/Spring Security(旧) 122楼
JAVA 全系列/第九阶段:权限控制与安全认证/Spring Security(旧) 124楼
JAVA 全系列/第九阶段:权限控制与安全认证/Shiro(旧) 127楼
JAVA 全系列/第九阶段:权限控制与安全认证/Shiro(旧) 129楼
JAVA 全系列/第九阶段:权限控制与安全认证/Spring Security(旧) 130楼

帮忙看下是我数据库写错了吗。不管怎么改都是登录失败。、

shiro-jdbcini如下:

[main]
dataSou=com.mchange.v2.c3p0.ComboPooledDataSource
dataSou.driverClass=com.mysql.jdbc.Driver
dataSou.jdbcUrl=jdbc://127.0.0.1:3306/shiro
dataSou.user=root
dataSou.password=root
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSou
securityManager.realm=$jdbcRealm

数据库代码:

CREATE TABLE `users` (
  `username` varchar(50) NOT NULL,
  `password` int(50) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

测试代码:

package com.liyang.shiro1;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

public class Test2 {
    public static void main(String[] args) {


        //      1  解析shiro。ini
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc.ini");
        //  2获得工厂实例
        SecurityManager securityManager = factory.getInstance();

        //3 把SecurityManager对象设置到运行环境中
        SecurityUtils.setSecurityManager(securityManager);
//4通过 SecurityUtils获得主体对象subject
        Subject subject = SecurityUtils.getSubject();
        //5书写自己输入的账号和密码
        UsernamePasswordToken token = new UsernamePasswordToken("sxt", "123");
        //6验证密码
        try {
            subject.login(token);
            //7 通过方法判断是否登录成功
            if (subject.isAuthenticated()) {
                System.out.println("登录成功");
            }
        } catch (AuthenticationException e) {
            System.out.println("登录失败");
            //e.printStackTrace();
        }
    }

输出结果:

image.png

JAVA 全系列/第九阶段:权限控制与安全认证/Shiro(旧) 131楼
JAVA 全系列/第九阶段:权限控制与安全认证/Shiro(旧) 133楼
JAVA 全系列/第九阶段:权限控制与安全认证/Spring Security(旧) 134楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637