美文网首页
spring boot集成阿里滑块验证

spring boot集成阿里滑块验证

作者: LegendaryTao | 来源:发表于2019-08-08 11:02 被阅读0次

    一、效果


    image.png

    二、java代码
    1、properties

    aliyun:
      properties:
        regionid: cn-hangzhou
        accessKeyId: LTAfadfanqxk2UGGX
        accessKeySecret: zZy08Y8EPafdfsfasMKKzxHaElFja
        appKey: FFFF0N00000342354
    
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    /**
     * 读取配置
     */
    @ConfigurationProperties(prefix = "aliyun.properties")
    @Component
    @Data
    public class AliyunProperties {
    
        private String regionid;
    
        private String accessKeyId;
    
        private String accessKeySecret;
    
        private String appKey;
    }
    

    2、pom.xml

    <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>aliyun-java-sdk-core</artifactId>
          <version>3.0.6</version>
    </dependency>
    <dependency>
          <groupId>com.ylyc.3dr</groupId>
          <artifactId>aliyun-java-sdk-afs</artifactId>
          <version>1.0.0</version>
    </dependency>
    

    3、beanConfig

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.IAcsClient;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class IAcsClientConfig {
    
        @Autowired
        private AliyunProperties aliyunProperties;
    
        @Bean
        public IAcsClient client() throws Exception {
            IClientProfile profile = DefaultProfile.getProfile(aliyunProperties.getRegionid(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
            IAcsClient client = new DefaultAcsClient(profile);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "afs", "afs.aliyuncs.com");
            return client;
        }
    
    }
    

    4、登录controller

    import com.aliyuncs.IAcsClient;
    import com.ctrip.entity.LoginModel;
    import com.ctrip.spring.utils.IPUtil;
    import com.aliyuncs.afs.model.v20180112.AuthenticateSigRequest;
    import com.aliyuncs.afs.model.v20180112.AuthenticateSigResponse;
    import com.ctrip.web.manage.config.AliyunProperties;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Controller
    @RequestMapping("/manage")
    public class LoginController1 {
    
        @Autowired
        private AliyunProperties aliyunProperties;
    
        @Resource
        private IAcsClient client;
    
        /**
         * 登录验证
         */
        @RequestMapping("/login")
        public String verification(HttpServletRequest request,HttpServletResponse response, Model model, LoginModel loginModel) {
            boolean isAuth = authValidate(loginModel,request);
            if(!isAuth){
                model.addAttribute("msg", "验证失败");
                return "login";
            }
            return "login";
        }
    
        /**
         * 验证滑块
         * @param loginModel
         * @param request
         * @return
         */
        private boolean authValidate(LoginModel loginModel, HttpServletRequest request) {
            String requestIp = IPUtil.getRemortIP(request);
            AuthenticateSigRequest authRequest = new AuthenticateSigRequest();
            // 必填参数,从前端获取,不可更改
            authRequest.setSessionId(loginModel.getSessionId());
            // 必填参数,从前端获取,不可更改
            authRequest.setSig(loginModel.getSig());
            // 必填参数,从前端获取,不可更改
            authRequest.setToken(loginModel.getToken());
            // 必填参数,从前端获取,不可更改
            authRequest.setScene(loginModel.getScene());
            // 必填参数,后端填写
            authRequest.setAppKey(aliyunProperties.getAppKey());
            // 必填参数,后端填写
            authRequest.setRemoteIp(requestIp);
    
            try {
                AuthenticateSigResponse acsResponse = client.getAcsResponse(authRequest);
                if(acsResponse.getCode() != 100) {
                    System.out.println("=======登录验签失败===" + requestIp);
                    return false;
                } else {
                    return true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }   
    }
    

    5、IPUtil

    import org.apache.commons.lang.StringUtils;
    import javax.servlet.http.HttpServletRequest;
    public class IPUtil {
        
        /**
         * 获取ip地址
         * @param request
         * @return
         */
        public static String getRemoteIP(HttpServletRequest request) {
            String ip = null;
            try {
                ip = request.getHeader("x-forwarded-for");
                if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                    ip = request.getHeader("Proxy-Client-IP");
                }
                if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                    ip = request.getHeader("WL-Proxy-Client-IP");
                }
                if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                    ip = request.getHeader("HTTP_CLIENT_IP");
                }
                if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
                }
                if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                    ip = request.getRemoteAddr();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return ip;
        }
    }
    

    6、entity

    import lombok.Data;
    
    @Data
    public class LoginModel {
    
        private String sessionId;
        private String sig;
        private String token;
        private String scene;
        private String appKey;
        private String remoteIp;
        private String phone;
        private String password;
    
        private String username;
        private String userpassword;
        private String code;
        private String rememberMe;
    
    }
    

    7、html

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <base href="/" />
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>C数据|登录</title>
    <meta
        content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
        name="viewport">
    <link rel="stylesheet" th:href="@{bootstrap/css/bootstrap.min.css}">
    <link rel="stylesheet" th:href="@{dist/css/AdminLTE.min.css}">
    <link rel="stylesheet" th:href="@{plugins/iCheck/square/blue.css}">
    <script th:src="@{plugins/jQuery/jquery-2.2.3.min.js}"></script>
    <script th:src="@{bootstrap/js/bootstrap.min.js}"></script>
    <script th:src="@{plugins/iCheck/icheck.min.js}"></script>
    <script type="text/javascript" charset="utf-8" src="//g.alicdn.com/sd/ncpc/nc.js?t=2015052012"></script>
        <style type="text/css">
            .nc_scale span {
                height: 34px !important;
            }
        </style>
    </head>
    <body class="hold-transition login-page">
        <div class="login-box">
            <div class="login-logo">
                <a href="index2.html"><b>C数据</b>后台管理</a>
            </div>
            <div class="login-box-body">
                <form id="loginform" th:action="@{/manage/login}"
                    th:method="post">
                    <div class="form-group has-feedback">
                        <input name="username" th:value="${username}" type="username" class="form-control"
                            placeholder="用户名"> <span
                            class="glyphicon glyphicon-user form-control-feedback"></span>
                    </div>
                    <div class="form-group has-feedback">
                        <input name="userpassword" type="password" class="form-control"
                            placeholder="密码"> <span
                            class="glyphicon glyphicon-lock form-control-feedback"></span>
                    </div>
                    <div id="your-dom-id" class="nc-container"></div> <!--No-Captcha渲染的位置,其中 class 中必须包含 nc-container-->
    
                    <!--请求后台所需数据-->
                    <input type="hidden" id="sessionId" name="sessionId"/>
                    <input type="hidden" id="sig" name="sig"/>
                    <input type="hidden" id="token" name="token"/>
                    <input type="hidden" id="scene" name="scene"/>
    
                    <div class="row">
                        <div class="checkbox">
                            <label> <input name="rememberMe" type="checkbox">
                                下次自动登录
                            </label>
                        </div>
                    </div>
                    <div class="box-footer">
                        <button type="submit" class="btn btn-primary pull-right">登录</button>
                    </div>
                </form>
                <div th:if="${msg}!=null" class="alert alert-warning alert-dismissible">
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                <p th:text="${msg}"></p>
                </div>
            </div>
        </div>
        <script>
            $(function() {
                $('input').iCheck({
                    checkboxClass : 'icheckbox_square-blue',
                    radioClass : 'iradio_square-blue',
                    increaseArea : '20%' // optional
                });
            });
            var nc_appkey = 'FFFF0N00000342354';  // 应用标识,不可更改,您可以从阿里云console的配置里找到它正确的值
    
            var nc_token = [nc_appkey, (new Date()).getTime(), Math.random()].join(':');
            var NC_Opt =
                {
                    renderTo: "#your-dom-id",
                    appkey: nc_appkey,
                    scene: "nc_login",
                    token: nc_token,
                    customWidth: 320,
                    trans:{"key1":"code0"},
                    elementID: ["usernameID"],
                    is_Opt: 0,
                    language: "cn",
                    isEnabled: true,
                    timeout: 3000,
                    times:5,
                    apimap: {
                        // 'analyze': '//a.com/nocaptcha/analyze.jsonp',
                        // 'get_captcha': '//b.com/get_captcha/ver3',
                        // 'get_captcha': '//pin3.aliyun.com/get_captcha/ver3'
                        // 'get_img': '//c.com/get_img',
                        // 'checkcode': '//d.com/captcha/checkcode.jsonp',
                        // 'umid_Url': '//e.com/security/umscript/3.2.1/um.js',
                        // 'uab_Url': '//aeu.alicdn.com/js/uac/909.js',
                        // 'umid_serUrl': 'https://g.com/service/um.json'
                    },
                    callback: function (data) {
                        $("#sessionId").val(data.csessionid);
                        $("#token").val(nc_token);
                        $("#sig").val(data.sig);
                        $("#scene").val("register");
                    }
                }
            var nc = new noCaptcha(NC_Opt)
            nc.upLang('cn', {
                _startTEXT: "请按住滑块,拖动到最右边",
                _yesTEXT: "验证通过",
                _error300: "哎呀,出错了,点击<a href=\"javascript:__nc.reset()\">刷新</a>再来一次",
                _errorNetwork: "网络不给力,请<a href=\"javascript:__nc.reset()\">点击刷新</a>",
            })
        </script>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:spring boot集成阿里滑块验证

          本文链接:https://www.haomeiwen.com/subject/pabtjctx.html